home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume24 / yabbawhap / part02 < prev    next >
Encoding:
Internet Message Format  |  1991-10-09  |  53.7 KB

  1. Subject:  v24i074:  Public-domain replacement for compress programs, Part02/04
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: df136ca4 06cd26cb fe48633b d7ce4fbe
  5.  
  6. Submitted-by: Dan Bernstein <brnstnd@nyu.edu>
  7. Posting-number: Volume 24, Issue 74
  8. Archive-name: yabbawhap/part02
  9.  
  10. #! /bin/sh
  11. # This is a shell archive.  Remove anything before this line, then feed it
  12. # into a shell via "sh file" or similar.  To overwrite existing files,
  13. # type "sh file -c".
  14. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  15. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  16. # Contents:  checkconf.c percent.h unyabba.c ycoding.uu yw.c
  17. # Wrapped by rsalz@litchi.bbn.com on Wed Mar 20 17:09:22 1991
  18. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  19. echo If this archive is complete, you will see the following message:
  20. echo '          "shar: End of archive 2 (of 4)."'
  21. if test -f 'checkconf.c' -a "${1}" != "-c" ; then 
  22.   echo shar: Will not clobber existing file \"'checkconf.c'\"
  23. else
  24.   echo shar: Extracting \"'checkconf.c'\" \(8576 characters\)
  25.   sed "s/^X//" >'checkconf.c' <<'END_OF_FILE'
  26. X/* Placed into the public domain by Daniel J. Bernstein. */
  27. X
  28. X#include <stdio.h>
  29. X
  30. Xextern long atol();
  31. X
  32. Xstatic char introspiel[] = "\
  33. Xcheckconf is a tool to help you configure yabba and whap for your system.\n\
  34. XIt lets you quickly experiment with options to see what effect they\n\
  35. Xwill have on program size and to make sure that they are appropriate\n\
  36. Xfor your system.\n\
  37. X\n\
  38. XYou can give checkconf any of the following options: -DPTRS, -UPTRS,\n\
  39. X-DBZERO, -UBZERO, -DMEMZERO, -UMEMZERO, -DZEROFILLED, -UZEROFILLED,\n\
  40. X-DTYPE=short, -DTYPE=int, -DHASHTYPE=short, -DHASHTYPE=int,\n\
  41. X-DHASHTYPE=TYPE, -DBITBUFSIZE=%%d, -DRESETNUM=%%d, -DRESETFUZZ=%%d,\n\
  42. X-DNODEMAX=%%d, -DNODENUM=NODEMAX, -DNODENUM=%%d, -DMOD=%%d. Here %%d means\n\
  43. Xany number. These options override CCOPTS in the Makefile. The Makefile\n\
  44. Xcontains more detailed information on each option.\n\
  45. X\n\
  46. Xcheckconf -H shows this help screen.\n\
  47. X\n\
  48. XBe sure to remake checkconf if you change the Makefile.\n\
  49. X";
  50. X
  51. X#ifndef BITBUFSIZE
  52. X#define BITBUFSIZE 1000
  53. X#endif
  54. X#ifndef RESETNUM
  55. X#define RESETNUM 8192
  56. X#endif
  57. X#ifndef RESETFUZZ
  58. X#define RESETFUZZ 30
  59. X#endif
  60. X#ifndef NODEMAX
  61. X#define NODEMAX 65533
  62. X#endif
  63. X#ifndef TYPE
  64. X#define TYPE short
  65. X#endif
  66. X#ifndef MOD
  67. X#define MOD 65536
  68. X#endif
  69. X
  70. Xunsigned long bitbufsize = BITBUFSIZE;
  71. Xunsigned long resetnum = RESETNUM;
  72. Xlong resetfuzz = RESETFUZZ;
  73. Xunsigned long nodemax = NODEMAX;
  74. X#ifndef NODENUM
  75. X#define NODENUM NODEMAX
  76. Xunsigned long nodenum = 0;
  77. X#else
  78. Xunsigned long nodenum = NODENUM;
  79. X#endif
  80. Xunsigned long mod = MOD;
  81. X#ifdef PTRS
  82. Xchar ptrs = 'D';
  83. X#else
  84. Xchar ptrs = 'U';
  85. X#endif
  86. X#ifdef BZERO
  87. Xchar cbzero = 'D';
  88. X#else
  89. Xchar cbzero = 'U';
  90. X#endif
  91. X#ifdef MEMZERO
  92. Xchar cmemzero = 'D';
  93. X#else
  94. Xchar cmemzero = 'U';
  95. X#endif
  96. X#ifdef ZEROFILLED
  97. Xchar zerofilled = 'D';
  98. X#else
  99. Xchar zerofilled = 'U';
  100. X#endif
  101. X
  102. Xstatic int h[100];
  103. X
  104. Xmain(argc,argv)
  105. Xint argc;
  106. Xchar *argv[];
  107. X{
  108. X int sshort = sizeof(short);
  109. X int sint = sizeof(int);
  110. X int slong = sizeof(long);
  111. X int sptr = sizeof(char *);
  112. X int st = sizeof(unsigned TYPE);
  113. X#ifndef HASHTYPE
  114. X#define HASHTYPE TYPE
  115. X int shasht = 0;
  116. X#else
  117. X int shasht = sizeof(HASHTYPE);
  118. X#endif
  119. X char *foo = 0;
  120. X int i;
  121. X int flag0;
  122. X char c;
  123. X int flagfill;
  124. X
  125. X while (*++argv)
  126. X  {
  127. X   if (!strcmp(*argv,"-DPTRS")) ptrs = 'D';
  128. X   else if (!strcmp(*argv,"-UPTRS")) ptrs = 'U';
  129. X   else if (!strcmp(*argv,"-DBZERO")) cbzero = 'D';
  130. X   else if (!strcmp(*argv,"-UBZERO")) cbzero = 'U';
  131. X   else if (!strcmp(*argv,"-DMEMZERO")) cmemzero = 'D';
  132. X   else if (!strcmp(*argv,"-UMEMZERO")) cmemzero = 'U';
  133. X   else if (!strcmp(*argv,"-DZEROFILLED")) zerofilled = 'D';
  134. X   else if (!strcmp(*argv,"-UZEROFILLED")) zerofilled = 'U';
  135. X   else if (!strcmp(*argv,"-DTYPE=short")) st = sshort;
  136. X   else if (!strcmp(*argv,"-DTYPE=int")) st = sint;
  137. X   else if (!strcmp(*argv,"-DHASHTYPE=short")) shasht = sshort;
  138. X   else if (!strcmp(*argv,"-DHASHTYPE=int")) shasht = sint;
  139. X   else if (!strcmp(*argv,"-DHASHTYPE=TYPE")) shasht = 0;
  140. X   else if (!strncmp(*argv,"-DBITBUFSIZE=",13)) bitbufsize = atol(*argv + 13);
  141. X   else if (!strncmp(*argv,"-DRESETNUM=",11)) resetnum = atol(*argv + 11);
  142. X   else if (!strncmp(*argv,"-DRESETFUZZ=",12)) resetfuzz = atol(*argv + 12);
  143. X   else if (!strncmp(*argv,"-DNODEMAX=",10)) nodemax = atol(*argv + 10);
  144. X   else if (!strcmp(*argv,"-DNODENUM=NODEMAX")) nodenum = 0;
  145. X   else if (!strncmp(*argv,"-DNODENUM=",10)) nodenum = atol(*argv + 10);
  146. X   else if (!strncmp(*argv,"-DMOD=",6)) mod = atol(*argv + 6);
  147. X   else if (!strcmp(*argv,"-H"))
  148. X    {
  149. X     fprintf(stderr,introspiel);
  150. X     exit(1);
  151. X    }
  152. X   else
  153. X    {
  154. X     fprintf(stderr,
  155. X         "checkconf: fatal: argument %s unrecognized. checkconf -H for help.\n"
  156. X         ,*argv);
  157. X     exit(1);
  158. X    }
  159. X  }
  160. X
  161. X if (shasht == 0)
  162. X   shasht = st;
  163. X if (nodenum == 0)
  164. X   nodenum = nodemax;
  165. X
  166. X flagfill = 1;
  167. X for (i = 0;i < sizeof(h) / sizeof(h[0]);i++)
  168. X   if (h[i])
  169. X     flagfill = 0;
  170. X
  171. X printf("\n");
  172. X printf("Sizes:  short %d  int %d  long %d  pointer %d\n",sshort,sint,slong,sptr);
  173. X printf("Internal representation of the NULL pointer:  ");
  174. X flag0 = 1;
  175. X for (i = 0;i < sptr;i++)
  176. X  {
  177. X   c = ((char *) (&foo))[i];
  178. X   printf("%d ",c);
  179. X   if (c)
  180. X     flag0 = 0;
  181. X  }
  182. X if (flag0)
  183. X   printf("(all zeros)\n");
  184. X else
  185. X   printf("(not all zeros)\n");
  186. X printf("\n");
  187. X
  188. X printf("major config: -%cPTRS  -DBITBUFSIZE=%ld  -DNODEMAX=%ld  -DMOD=%ld\n"
  189. X    ,ptrs,bitbufsize,nodemax,mod
  190. X    );
  191. X printf("type config: TYPE size %ld  HASHTYPE size %ld\n"
  192. X    ,st
  193. X    ,shasht
  194. X    );
  195. X printf("minor config: -DRESETNUM=%ld  -DRESETFUZZ=%ld  -DNODENUM=%ld\n"
  196. X    ,resetnum,resetfuzz,nodenum
  197. X    );
  198. X printf("system config: -%cBZERO  %s-%cMEMZERO%s  -%cZEROFILLED\n"
  199. X    ,cbzero
  200. X    ,(cbzero == 'U' ? "" : "(")
  201. X    ,cmemzero
  202. X    ,(cbzero == 'U' ? "" : ", not relevant with -DBZERO)")
  203. X    ,zerofilled
  204. X    );
  205. X
  206. X/* printf("\n"); */
  207. X printf("Array use:\n");
  208. X if (ptrs == 'D')
  209. X   printf("  whap:   total %ld  huptrie data %ld hash %ld  bitbuf %ld\n"
  210. X      ,2 * sptr * (nodemax + 1) + mod * sptr + (bitbufsize + 1) * 2 * st
  211. X      ,2 * sptr * (nodemax + 1)
  212. X      ,mod * sptr
  213. X      ,(bitbufsize + 1) * 2 * st
  214. X      );
  215. X else
  216. X   printf("  whap:   total %ld  huptrie data %ld %ld hash %ld  bitbuf %ld\n"
  217. X      ,2 * st * (nodemax + 1) + mod * st + (bitbufsize + 1) * 2 * st
  218. X      ,st * (nodemax + 1)
  219. X      ,st * (nodemax + 1)
  220. X      ,mod * st
  221. X      ,(bitbufsize + 1) * 2 * st
  222. X      );
  223. X printf("  unwhap: total %ld  outarray %ld  outpos %ld\n"
  224. X    ,nodemax + st * nodemax
  225. X    ,nodemax
  226. X    ,st * nodemax
  227. X    );
  228. X
  229. X if (ptrs == 'D')
  230. X   printf("  yabba:    tot %ld  ht d %ld %ld %ld h %ld  bb %ld\n"
  231. X      ,2 * sptr * (nodemax + 1) + sptr * (nodemax + 1) + shasht * (nodemax + 2) + mod * sptr + (bitbufsize + 1) * 2 * st
  232. X      ,2 * sptr * (nodemax + 1)
  233. X      ,sptr * (nodemax + 1)
  234. X      ,shasht * (nodemax + 2)
  235. X      ,mod * sptr
  236. X      ,(bitbufsize + 1) * 2 * st
  237. X      );
  238. X else
  239. X   printf("  yabba:    tot %ld  ht d %ld %ld %ld %ld h %ld  bb %ld\n"
  240. X      ,st * (nodemax + 1) + st * (nodemax + 1) + st * (nodemax + 1) + shasht * (nodemax + 2) + mod * st + (bitbufsize + 1) * 2 * st
  241. X      ,st * (nodemax + 1)
  242. X      ,st * (nodemax + 1)
  243. X      ,st * (nodemax + 1)
  244. X      ,shasht * (nodemax + 2)
  245. X      ,mod * st
  246. X      ,(bitbufsize + 1) * 2 * st
  247. X      );
  248. X
  249. X if (ptrs == 'D')
  250. X   printf("  unyabba:  tot %ld  ht d %ld %ld %ld %ld h %ld\n"
  251. X      ,2 * sptr * (nodemax + 1) + sptr * (nodemax + 1) + shasht * (nodemax + 2) + (nodemax + 1) + mod * sptr
  252. X      ,2 * sptr * (nodemax + 1)
  253. X      ,sptr * (nodemax + 1)
  254. X      ,shasht * (nodemax + 2)
  255. X      ,(nodemax + 1)
  256. X      ,mod * sptr
  257. X      );
  258. X else
  259. X   printf("  unyabba:  tot %ld  ht d %ld %ld %ld %ld %ld h %ld\n"
  260. X      ,st * (nodemax + 1) + st * (nodemax + 1) + st * (nodemax + 1) + shasht * (nodemax + 2) + (nodemax + 1) + mod * st
  261. X      ,st * (nodemax + 1)
  262. X      ,st * (nodemax + 1)
  263. X      ,st * (nodemax + 1)
  264. X      ,shasht * (nodemax + 2)
  265. X      ,(nodemax + 1)
  266. X      ,mod * st
  267. X      );
  268. X
  269. X#define MAX(foo) ((unsigned long) ((unsigned foo) (-1))) /*XXX*/
  270. X
  271. X printf("\n");
  272. X printf("Validity checks:\n");
  273. X if (mod & (mod - 1))
  274. X printf("MOD is a power of 2: FAILED!\n");
  275. X if ((nodenum < 512) || (nodenum > nodemax))
  276. X printf("NODENUM (default c-size) is between 512 and NODEMAX: FAILED!\n");
  277. X if ( ( (st == sshort) ? MAX(short)
  278. X     : ( (st == sint) ? MAX(int) : MAX(TYPE) ) ) < nodemax + 2 )
  279. X printf("NODEMAX (maximum c-size) + 2 fits into TYPE: FAILED!\n");
  280. X if ( ( (shasht == sshort) ? MAX(short)
  281. X     : ( (shasht == sint) ? MAX(int) : MAX(HASHTYPE) ) ) < mod - 1 )
  282. X printf("MOD - 1 fits into HASHTYPE: FAILED!\n");
  283. X if (MAX(int) < bitbufsize + 3)
  284. X printf("BITBUFSIZE + 3 fits into int: FAILED!\n");
  285. X if (ptrs == 'U')
  286. X if (!flag0)
  287. X if ((cbzero == 'D') || (cmemzero == 'D') || (zerofilled == 'D'))
  288. X printf("Under -DPTRS, if NULL isn't 0, must -UBZERO -UMEMZERO -UZEROFILLED: FAILED!\n");
  289. X
  290. X printf("\n");
  291. X printf("Range sanity checks:\n");
  292. X if (mod < 512) printf("MOD should be at least 512\n");
  293. X if (bitbufsize < 128) printf("BITBUFSIZE should be at least 128\n");
  294. X if (nodemax < 1024) printf("NODEMAX should be at least 1024\n");
  295. X if (resetnum < 3 * bitbufsize)
  296. X   printf("RESETNUM should probably be at least BITBUFSIZE * 3\n");
  297. X if (((long)resetfuzz < -(long)(bitbufsize / 10))
  298. X   ||(resetfuzz > bitbufsize / 10))
  299. X   printf("RESETFUZZ should probably be at most BITBUFSIZE/10 in absolute value\n");
  300. X if (st > sint)
  301. X   printf("TYPE should probably fit into an int\n");
  302. X if (shasht > sint)
  303. X   printf("HASHTYPE should probably fit into an int\n");
  304. X
  305. X printf("\n");
  306. X printf("System requirements:\n");
  307. X if (cbzero == 'D')
  308. X   printf("bzero() must be available\n");
  309. X else if (cmemzero == 'D')
  310. X   printf("memset() must be available\n");
  311. X if (zerofilled == 'D')
  312. X  {
  313. X   printf("static arrays must be filled with null bytes upon entry to main()\n");
  314. X   if (!flagfill)
  315. X     printf("  wait! that doesn't seem to be true here...\n");
  316. X  }
  317. X
  318. X printf("\n");
  319. X exit(0);
  320. X}
  321. END_OF_FILE
  322.   if test 8576 -ne `wc -c <'checkconf.c'`; then
  323.     echo shar: \"'checkconf.c'\" unpacked with wrong size!
  324.   fi
  325.   # end of 'checkconf.c'
  326. fi
  327. if test -f 'percent.h' -a "${1}" != "-c" ; then 
  328.   echo shar: Will not clobber existing file \"'percent.h'\"
  329. else
  330.   echo shar: Extracting \"'percent.h'\" \(970 characters\)
  331.   sed "s/^X//" >'percent.h' <<'END_OF_FILE'
  332. X/* Placed into the public domain by Daniel J. Bernstein. */
  333. X
  334. X/* This is one of those functions that everyone needs occasionally */
  335. X/* but nobody wants to write: computing what percentage x/y is, where */
  336. X/* x and y are unsigned longs. Sure, you can do it in floating point, */
  337. X/* but would you bet your sister on the accuracy of the result? Sure, */
  338. X/* you can just compute ((100 * x) + (y/2)) / y, but what are you */
  339. X/* going to do about overflow? percent() is the answer. Unless I've */
  340. X/* flubbed something, percent() will never overflow, will always */
  341. X/* return a properly rounded value, and will never take too long. */
  342. X
  343. X#ifndef PERCENT_H
  344. X#define PERCENT_H
  345. X
  346. Xlong percent();
  347. X
  348. X/* long percent(a,b,limit) unsigned long a; unsigned long b; long limit; */
  349. X/* returns the correctly rounded value of 100a/b */
  350. X/* returns 100 if b is 0 */
  351. X/* returns limit if the result is limit or larger */
  352. X/* limit must be at least 100 */
  353. X/* note that halves are rounded up */
  354. X
  355. X#endif
  356. END_OF_FILE
  357.   if test 970 -ne `wc -c <'percent.h'`; then
  358.     echo shar: \"'percent.h'\" unpacked with wrong size!
  359.   fi
  360.   # end of 'percent.h'
  361. fi
  362. if test -f 'unyabba.c' -a "${1}" != "-c" ; then 
  363.   echo shar: Will not clobber existing file \"'unyabba.c'\"
  364. else
  365.   echo shar: Extracting \"'unyabba.c'\" \(7310 characters\)
  366.   sed "s/^X//" >'unyabba.c' <<'END_OF_FILE'
  367. X/* Placed into the public domain by Daniel J. Bernstein. */
  368. X
  369. X/* Want to make yourself popular? Figure out a fast Y decoding method.  */
  370. X
  371. X#include <stdio.h>
  372. Xextern long atol();
  373. Xextern int getopt();
  374. Xextern char *optarg;
  375. Xextern int optind;
  376. X#include "bitout.h"
  377. X#include "percent.h"
  378. X#include "texts.h"
  379. X#include "huptrie.h"
  380. X
  381. Xstatic char progname[] = "unyabba";
  382. Xstatic char progged[] = "UnY'ed";
  383. X
  384. Xint twom1[9] = { 0,1,3,7,15,31,63,127,255 } ;
  385. X
  386. X#define ALPHABET 256
  387. X
  388. X#ifndef NODEMAX
  389. X#define NODEMAX (65533)
  390. X#endif
  391. X#ifndef NODENUM
  392. X#define NODENUM NODEMAX
  393. X#endif
  394. X#ifndef MOD
  395. X#define MOD (65536)
  396. X#endif
  397. X
  398. XSTATICDECLARE(n,p,h,NODEMAX,MOD - 1)
  399. Xnode s[NODEMAX + 1];
  400. Xhash geth[NODEMAX + 2]; /* aargh */
  401. Xchar gc[NODEMAX + 1];
  402. X
  403. X#define NUMOF(no) node2pos(n,no,NODEMAX)
  404. X
  405. X#define CHECKMAXBITS \
  406. X((max == nextbits) && ((bits++), \
  407. X  (nextbits = pos2ipos(n,2 * ipos2pos(n,nextbits,NODEMAX),NODEMAX))))
  408. X
  409. X#define ADD(hash,oldnode,node,ch) \
  410. X( (void) ( ADDMAX(n,p,h,max,oldnode,hash,node), \
  411. X(gc[node2ipos(n,node,NODEMAX)] = ch), \
  412. X(geth[node2ipos(n,node,NODEMAX)] = hash), CHECKMAXBITS ) )
  413. X
  414. X#define SUB(ip1,ip2) (ip1 - ip2) /* XXXX: This breaks encapsulation! Ungood. */
  415. X
  416. Xstatic unsigned long savein = 0;
  417. Xstatic unsigned long saveout = 0;
  418. Xstatic int flagverbose = 1;
  419. Xstatic int flagrandom = 0;
  420. X
  421. Xvoid goaheadandbeverbose()
  422. X{
  423. X long per = percent(savein,saveout,10000L);
  424. X
  425. X if (per == 10000L) /* absolutely ridiculous */
  426. X   fprintf(stderr,"In: %ld chars  Out: %ld chars  %s from: >9999%%\n",
  427. X           savein,saveout,progged);
  428. X else
  429. X   fprintf(stderr,"In: %ld chars  Out: %ld chars  %s from: %ld%%\n",
  430. X       savein,saveout,progged,per);
  431. X}
  432. X
  433. Xvoid fatalinfo(x,ss)
  434. Xint x;
  435. Xchar **ss;
  436. X{
  437. X if (flagverbose) while (*ss)
  438. X  {
  439. X   fprintf(stderr,*(ss++),NODENUM);
  440. X   putc('\n',stderr);
  441. X  }
  442. X (void) exit(x);
  443. X}
  444. X
  445. X#define PUTERR { if (flagverbose) fprintf(stderr,"%s: fatal: output error\n",progname); \
  446. Xsavein += in; saveout += out; \
  447. Xif (flagverbose >= 2) goaheadandbeverbose(); (void) exit(2); }
  448. X
  449. Xmain(argc,argv)
  450. Xint argc;
  451. Xchar *argv[];
  452. X{
  453. X register pos i;
  454. X register node matchnode;
  455. X register hash matchhash;
  456. X register node dosnode;
  457. X register node oldnode;
  458. X register ipos max;
  459. X register ipos nextbits;
  460. X register bitnum bits;
  461. X register bitword curw = 0;
  462. X register bitnum curbb = 0;
  463. X register int ch;
  464. X register ipos min;
  465. X register unsigned long in = 0;
  466. X register unsigned long out = 0;
  467. X register node curnode;
  468. X register int firstch;
  469. X pos smax;
  470. X
  471. X min = pos2ipos(n,NODENUM - 1,NODEMAX);
  472. X
  473. X  {
  474. X   int opt;
  475. X   bitword i;
  476. X
  477. X   while ((opt = getopt(argc,argv,"m:vqQrRACHUVW")) != EOF)
  478. X     switch(opt)
  479. X      {
  480. X       case '?': fatalinfo(1,unsqusage);
  481. X       case 'm': i = atol(optarg);
  482. X         if ((i < 512) || (i > NODEMAX))
  483. X          {
  484. X           if (flagverbose) fprintf(stderr,
  485. X              "%s: fatal: mem size out of range: must be between 512 and %ld\n",
  486. X              progname,(long) NODEMAX);
  487. X           (void) exit(1);
  488. X          }
  489. X         min = pos2ipos(n,i - 1,NODEMAX);
  490. X         break;
  491. X       case 'v': flagverbose = 2; break;
  492. X       case 'q': flagverbose = 0; break;
  493. X       case 'Q': flagverbose = 1; break;
  494. X       case 'r': flagrandom = 1; break;
  495. X       case 'R': flagrandom = 0; break;
  496. X       case 'A': fatalinfo(1,unsqauthor); break;
  497. X       case 'C': fatalinfo(1,unsqcopyright); break;
  498. X       case 'H': fatalinfo(1,unsqhelp); break;
  499. X       case 'U': fatalinfo(1,unsqusage); break;
  500. X       case 'V': fatalinfo(1,unsqversion); break;
  501. X       case 'W': fatalinfo(1,unsqwarranty); break;
  502. X      }
  503. X   argv += optind;
  504. X   argc -= optind;
  505. X  }
  506. X
  507. X if (!flagrandom)
  508. X  {
  509. X   bitword i = 0;
  510. X   int r;
  511. X
  512. X   if ((getchar() != 25)
  513. X     ||(getchar() != 1)
  514. X     ||(getchar() != 2)
  515. X     ||(getchar() != 2)
  516. X     ||(getchar() != 1)
  517. X     ||((r = getchar()) == EOF))
  518. X    {
  519. X     if (flagverbose) fprintf(stderr,"%s: fatal: input not in right format\n",progname);
  520. X     (void) exit(3);
  521. X    }
  522. X   in += 6;
  523. X   while (r)
  524. X    {
  525. X     if (((ch = getchar()) == EOF) || (ch < 48) || (ch > 57))
  526. X      {
  527. X       if (flagverbose) fprintf(stderr,"%s: fatal: input not in right format\n",progname);
  528. X       (void) exit(3);
  529. X      }
  530. X     ++in; /* XXX: check for overflow */
  531. X     i = i * 10 + (ch - 48);
  532. X     --r;
  533. X    }
  534. X   if (i != ipos2pos(n,min,NODEMAX) + 1)
  535. X    {
  536. X     if (flagverbose) fprintf(stderr,"%s: fatal: input has -m %ld, I have -m %ld\n"
  537. X         ,progname,(long) i,(long) ipos2pos(n,min,NODEMAX) + 1);
  538. X     (void) exit(4);
  539. X    }
  540. X  }
  541. X
  542. X FIRSTHASH(h,MOD - 1)
  543. X
  544. Xrestart:
  545. X
  546. X STATICINIT(n,p,h,max,smax,NODEMAX,MOD - 1)
  547. X
  548. X nextbits = pos2ipos(n,ALPHABET,NODEMAX);
  549. X bits = 8;
  550. X
  551. X geth[node2ipos(n,topnode(n,NODEMAX),NODEMAX)] = tophash(h,MOD - 1);
  552. X
  553. X for (ch = 0;ch < ALPHABET;++ch)
  554. X  {
  555. X   ADD(hc(tophash(h,MOD - 1),ch,MOD - 1),topnode(n,NODEMAX),curnode,ch);
  556. X   s[node2ipos(n,curnode,NODEMAX)] = topnode(n,NODEMAX);
  557. X  }
  558. X WASTEMAX(n,p,h,max,smax,curnode); CHECKMAXBITS;
  559. X /* leaving space for the clear code, ALPHABET */
  560. X
  561. X matchnode = topnode(n,NODEMAX);
  562. X matchhash = tophash(h,MOD - 1);
  563. X
  564. X for (;;)
  565. X  {
  566. X   /* assumes bits >= 8 */
  567. X   while (curbb + 8 < bits) /* could be an if, when bits is < 16 */
  568. X     if ((ch = getchar()) != EOF)
  569. X      {
  570. X       curw += ch << curbb;
  571. X       curbb += 8;
  572. X       ++in; /* XXX: check for overflow */
  573. X      }
  574. X     else
  575. X      {
  576. X       savein += in; saveout += out;
  577. X       if (flagverbose >= 2)
  578. X     goaheadandbeverbose();
  579. X       (void) exit(0);
  580. X      }
  581. X   if ((ch = getchar()) == EOF)
  582. X    {
  583. X     savein += in; saveout += out;
  584. X     if (flagverbose >= 2)
  585. X       goaheadandbeverbose();
  586. X     (void) exit(0);
  587. X    }
  588. X   i = curw + ((ch & twom1[bits - curbb]) << curbb);
  589. X   curw = ch >> (bits - curbb);
  590. X   curbb = 8 - (bits - curbb);
  591. X   ++in; /* XXX: check for overflow */
  592. X
  593. X   /* XXX: flagpedantic to control whether we make this test? */
  594. X   if (i > ipos2pos(n,max,NODEMAX))
  595. X     if (flagrandom)
  596. X       i -= ipos2pos(n,max,NODEMAX) + 1;
  597. X     else
  598. X      {
  599. X       if (flagverbose) fprintf(stderr,"%s: fatal: input corrupt at byte %ld\n",progname,in);
  600. X       (void) exit(5);
  601. X      }
  602. X
  603. X   if (i == ALPHABET) /* clear */
  604. X    {
  605. X     savein += in;
  606. X     saveout += out;
  607. X     /* XXX: test for overflow? */
  608. X     in = 0;
  609. X     out = 0;
  610. X     CLEARHASH(h,MOD - 1)
  611. X     goto restart;
  612. X    }
  613. X   curnode = pos2node(n,i,NODEMAX);
  614. X
  615. X   while (curnode != topnode(n,NODEMAX))
  616. X    {
  617. X     ch = gc[node2ipos(n,curnode,NODEMAX)];
  618. X     curnode = s[node2ipos(n,curnode,NODEMAX)];
  619. X#ifdef BRAINDAMAGED
  620. X     if (((char) ch) == (char) 255)
  621. X       putchar((char) ch);
  622. X     else
  623. X#endif
  624. X     if (putchar((char) ch) == EOF)
  625. X       PUTERR
  626. X     ++out; /* XXX: check for overflow */
  627. X
  628. X#define MATCHADD { if (matchnode == topnode(n,NODEMAX)) firstch = ch; \
  629. Xif (dosnode) { ADD(matchhash,matchnode,oldnode,firstch); \
  630. Xs[node2ipos(n,dosnode,NODEMAX)] = oldnode; dosnode = oldnode; } \
  631. Xelse ADD(matchhash,matchnode,dosnode,firstch); \
  632. Xmatchnode = s[node2ipos(n,matchnode,NODEMAX)]; \
  633. Xfirstch = gc[node2ipos(n,matchnode,NODEMAX)]; \
  634. Xmatchhash = geth[node2ipos(n,matchnode,NODEMAX)]; \
  635. X}
  636. X
  637. X/* XXXX: get rid of first if (max != min) ? */
  638. X/* XXX: is DOWNI too slow? */
  639. X#define MATCHDOWN if (max != min) { dosnode = 0; \
  640. Xdo { matchhash = hc(matchhash,ch,MOD - 1); \
  641. XDOWNI(n,p,h,matchnode,matchhash,oldnode,{break;},MATCHADD) } while(max!=min);\
  642. Xif (matchnode == topnode(n,NODEMAX)) firstch = ch; \
  643. Xif (dosnode) s[node2ipos(n,dosnode,NODEMAX)] = oldnode; \
  644. Xmatchnode = oldnode; }
  645. X/* XXX: Should unroll the loop a bit. */
  646. X     MATCHDOWN
  647. X
  648. X    }
  649. X
  650. X#ifdef notdef
  651. X/*XXX: -d code */
  652. X#endif
  653. X
  654. X  }
  655. X}
  656. END_OF_FILE
  657.   if test 7310 -ne `wc -c <'unyabba.c'`; then
  658.     echo shar: \"'unyabba.c'\" unpacked with wrong size!
  659.   fi
  660.   # end of 'unyabba.c'
  661. fi
  662. if test -f 'ycoding.uu' -a "${1}" != "-c" ; then 
  663.   echo shar: Will not clobber existing file \"'ycoding.uu'\"
  664. else
  665.   echo shar: Extracting \"'ycoding.uu'\" \(22480 characters\)
  666.   sed "s/^X//" >'ycoding.uu' <<'END_OF_FILE'
  667. Xbegin 600 ycoding.Y
  668. XM&0$"`@$$.3DY.5E`C'E#)HV;,PH4$`GC)DT9-B"4N``AI(P<-W/HE#&8<,@;
  669. XM.'GDI#F#A@Z(&#ERQ)@8A`U$DB;IS)E99HY%.V7(N%`H)XP9E#3$L`#1)(R<
  670. XM,6A2YFBJDN50!530I,F9)F<8$&2,(IT(-@S*-F48CJ5S(N><.G#@O.E)!@2=
  671. XM-R#$E`%1Q\W.,&3"B&%3IFD;L9@I&SS#0H&8-R1)/^Z)><Z<I@P1GRGCQF*8
  672. XMF'E`W)'SYJ!+-\7)E+&39FZ:Y#G-(&^3&(UC-ZG!0RVC(,R8,6FDN\'9HD4+
  673. XMN8.+OX]O/IR:$J,.E`(D\,#RDBM#/-EJFZ@(W4!XPPSCH&I(N804P`^_%E*:
  674. XM*(GZD".CCC&N2^Y&'IG0X@J!"!HM(2/2P`.WL]B`0Z[&4`KB-A3I"&,-Q]#*
  675. XM2+4S@E01*#G"F\O,--=T"P20,"(220<5``.,@I)<$JH\3C@!!")R1&O#%A1K
  676. XM8<.Z^(,CT.Z^ZQ/0G!0CJ[XR>I/C/ESG4,",-V)ZXXXY=$@(!!!@F&B*.^5`
  677. XM28SBCDU6T+ND`BR/-E"#:,67MMT3LC3BJ,.Q;\6U:*A[?P23SO%`@/<@GE""
  678. XM8R<SPD0:8T('JB\,@PXSJ-:)4)!BKO'D:.IJK;N6^5ZP>R;C.[JC)CM(E,JZ
  679. XM&JB&Z.NX)/-V"J^L@C(R:-7D7$A!9AG>PI-UGW_#`R6)*;9XC+.02A3JL).(
  680. XM&8097"(#,3BVYU9P55F%E68,)BB/F4=M(BO9R5+6,IC)C`;Z^A/4H/8L\/3L
  681. XM6:&36E/F@+]&$:HQ9S!(3N[`EZF,(7TUF(@4R@"'NZ!$AWUR8TI$=AV(%*HL
  682. XM96@#'.A0'!2DP05E<(%K`@F1/$)-!MS9&AOFD(*N&"$U#,-#&!B)F2:&H3@<
  683. XM*TO/>N(@,8Q!.F8P21K4L`8VM,$\<(A#N>A0!SO<`0]YT$.<$+/+XAAR7<2L
  684. XMUJ#R8!DQ4":@!#VHX=XP$2+TR5]>#*.9.#D:S`A$+D9)$KGFJ(`@3,0)\0I<
  685. XMT(A&E[D\C$UW*(-O"#4GBI8E"7[A3AJZR=*7RK1M_]R!G.CIL[G.)5'=4Y04
  686. XM#QD&?2TFJV>)WS_1<K_]`1!6YZ06U/+`KAT"D8A'G%I7@"I4>"X3H0M=*$3-
  687. XM.5&YF&6D)D7I8>LZ4Z2Q`3:L?<MX%(!4ID)UJE?5JMC.B=XP-)&TIT6,95Y;
  688. XM6]T"%V\[:<.ADJ>GB5QAI5@S2`C_]CICN>$W&\SD>1?9R#S02V:%VMO>:$WK
  689. XM&D_%RGO[C5#+W%N9`72^],WOWHHSZ]8"W&P@1C"#(TQA#?].;^V.-[Z;3>LM
  690. XM']PR>6,,S'&.=5H+E.E;%JC5&=-UL[O=\'@/?.!+1?3&7][TO#]][*6.MUK_
  691. XM'O/8CS_H\[[RN[[*4(`$J+^D.[J[F\`-7,"`(L'$R[_2.[P"),(FG$+RPQLM
  692. XM3,#]@[Z"JL-!5$0HQ$*X$T//.RA7[,5B7,6#(L$23+X"1"VU>\=]'$B%#$F(
  693. XMO!?,4[NHS,J4M$F?-,J1A"BGO$JK3(@K"`N5,JVK\111";,T&TTR>8,&@8,&
  694. XM"1P[$(X0RIB&F0ID4P#(D`[+BDW>.K&R2!HC&0.>V).>`"'<J4X6432*H:D[
  695. XM"`NIN`TO:@\P6C"MPB)XN8.F*(O`,`.FB0_0X9:=,$W57$X5H0F#$`Y\4@[]
  696. XM7!<%6I8ZTB=M68P%==`"S0D*Q5`-'8O+$:G#H!(KP1(9\8H\4)91)0[ER51.
  697. XM?;3V7+/U8*G"V*I%I8_J&(ZFH",8H*?%X(,@X`,0Z!$_:I?T%"&^B->+PXP6
  698. XM^+A$`=1S\I`RH2.!)5@F$0P@<=9ENK-8HB5;PJ6>038#_=;_<#LN0XLL*S\&
  699. XMM+OK6TS3^-`0+;`PP+-BK2D9H`%\Z2,_0MT9$)X;$)X<8!\_D@$<8!_4C0'3
  700. XMC8$70C%'45<(C:>>V8G`8(/M,K?%H[?R3!15;=58=1(I657I(.`N08*@&DG3
  701. XM:E(HM=(M_5(Q_5.R8)&L.H'5V2+."1PLN9OF+=`?0#%C<M*=V*PD7>$7AE;[
  702. XM=+5\B2%_"9@$2ICMI)[KR1B.\1@.`J$1<IE]:9-"\;+"0S5'^M,UFHP]Z5P]
  703. XM=5@W2$XZ\"]D>IINGK6!D(/N)0S="!2-_5B13=DSE9D?"8+!\`WYZ1CP"IYZ
  704. XMSN=^)NB%AFC_PHRXPB(?<BNX"FJ,*;PL;NF7ENF:)N)F;>3T:9_WD9_Z^3)J
  705. XM1:`Z5>_G08EC9N9H9J%JWFCUIE8AMFW=]NT!!U:`E@RA.*-Z?J,XXM,]\J-.
  706. XM8QC=$!8S:`'!1HE(FJ1*\G,\'Z52.B558B58TMJN!=OCZ6OE'&/'*-W35=W6
  707. XMC5W:O5W=[5W@'5Z%J*B,XBB0JCB-`VJ;BI8@^"NHR?<+.3!B>C`%`&V_(C*2
  708. XM-S55"Z^@&A^SP&KSK).P?K++JIJXX:)_.C''0-WE+G:[P`O"<A0$=W#0EAK.
  709. XM*I,P*'H4::W.BI^U;W%(!GN;Q>@("J\&;PKLK^REO;8W]_!>WQM\)2;Q^1'(
  710. XMU^CDE.<3)J4O];T^VG=>Q,#QXUO/+P)^,T=F`..?_5L,8@#0D"9$DSS*@HOX
  711. XM56@`.=0!DQ`XW!5[8'2MIF\8.^W!>]3>M+DV3P/6``_3M6OR3:T9-Z>KZ.@-
  712. XM%`!06(`,L`$I@","G*@&=SZB92B)-P`E^D2`0WANXDY$`0*E).*`I,@4S1=%
  713. XMS(ACD23F@*2X$LT7381=[P<HD@$6X+N2(D>ZC.L'W.D-%1`&5`!(K`RO,08X
  714. XM1J;8&[4CN%,O<H\Y.L=)F!(Z&U0`'K9+;WP!,?`%@J)9G`$R`"6FH^^(CMJC
  715. XM[4*#3@;*9,@-&2`1I()<'UIQ-B)&US@#9@!*)$4K\KT`#][5%0O*:Z0!)7([
  716. XMHB^\R.X`8UE,C#.@!J#$C40J[4M4PX>2237VEQEP$MLEM+POY#)=@D3^,@.0
  717. XM(KO\E_-&ZUV'"$5,V$!-H`.^"JO0CL-@432"7=`NG61TY<)>.!6*%_O;A-A+
  718. XMQODX([?DH)R5ZW+X+*\1.]/`(.3(9GMLA1/_63;.I@4OBYGR+UF*#90W9F@'
  719. XM]V#W:U,SP3CIAJFEG)(&3Z`/UB$Y')+?$*EVB;AI#,()-E`V?U9%)Y^Q*`Z3
  720. XMK8WZ3^=D$8H#&U`70W!R$C$\>"MTAJ,8I49CB$F'LS>IFI;VS'GWL[#4`=P6
  721. XM.MZ9#KTS<F"4'D`V8`O_PE&84<KIH?X&!6!/W^=_>@.789'D,7CQ!M9`<9(C
  722. XMKR1L\#-VF`:X%MJ,HKQC@?&(T>*A%H-PZEY22SG%0@#F38(4;L@#MO`';*9&
  723. XMH59Z!F'X%E$#@&&P-=:9K!@?'6(&YJA<"'LJQFB)PZMXKV39A5?W"K9@'(N2
  724. XM"?Q!/A`'!7`&D(-0(1VX(\1(A_!0KO@KB6!C6S7A^;/E=D2#X++;##9!)RQ1
  725. XM)WI,$,68>J\9XWF>DQ+[&GX&;1!C<.`]4))6)^MNW:YCFF.U:QF-5_%-)NV#
  726. XM*F!1@T\0,8E:G![DC;((PDF-1HI*\1(0W^KX5B:QEKF+!!%E?E.9*+2(%B5H
  727. XMIQ7E46H`8^`+4/8)^%,A-C/IC7:-`;SKO<ZLX[$N<@#JNKH70G^E)T3B;@V8
  728. XM`G@":1:#R`7=0&'O22V=+*F7IFE7-0`;4$(,@%V=:UXH`&IW[;;=MQ-WY0[=
  729. XML3MX1[QNQL)26\]).ADHM5%R4^X`Q@'VM]RY+C\R(MD'[-J4[*/JWDOV,;MF
  730. XM`.`E5TK3A[XT)W4=@`*]TH!EX%?UNJI;=:MN#5``@;CJLER6VX@=,<O5O,M*
  731. XM>9C;26L+[=4K<2T79$QE#/-K-&Z`'\G$7:$)%(;H6J@PRT!@KX(!;"2-F*(T
  732. XM+Q>>X;:#!"KHA",Q1'%'O9H3JBKGP5M8"Z`&E)X@3G'6-94^R8MK_\*O79K"
  733. XM=R\L*XC&ICRHARH.N!7>E@784`=XE:@R56:9D70OD\([)`?&T`@_ER!'*H4[
  734. XM-+XN-EX,-0`&E(#\"FG+A._2S?;4K>2P'D92]``NV8!-\`[3DUZ'%KK#.ZZB
  735. XM!Z8-((FI,#N@:E%.R8A!'`/HAB"<INAU8*\LSPX;!^.409FALW+.D`$Q,^;#
  736. XMH+#:0%SM$1Q#\_9BJ'`&F,0SWJQGP<=BAW-"':2#7PW2C;F*V@4ARTWOIE`)
  737. XM`[;0B;!7@["DV>I02#'0(3F<@$'[QV"8+$D26/.&3>>0_#_\Z=I*)T&4FRH(
  738. XM(6@>4`,9*`Z2H5=9D"^,^"0NN/++WJ)8&S;].HY%=$\N#!+#-/3IVI`:H"S3
  739. XM@AM&(2,T!0#644$J8[L0><`X\88V,5#&`%3MV,I:IDIK@EJ9@9_;%MF*(F9[
  740. XM!MK@-G+VS^X*SF$OJ^X-K+QLB2:.RH[N6R2J.B`&5A:$]F(M3XRQ+*BKMV@<
  741. XMJ++8*`!>;)%=51Q\P]Y4EHWL9K/NV?V]]VUFM:+.59_DB%_[+U0%^((*OHI/
  742. XM-'$BAEDLAQ?#&P<&RVH<ESQN/5>.F."`&2V<BC3!M"G)K"#:JDID$PLS]95%
  743. XM:`I-,V\D?/1R8)X01@M[3=V%6E$W:EK+5O#`VK,,LT$'Y'(PX"&&>1D=QY/\
  744. XM#,<KTY#P@%I3.!4K(J;7='#->_5*AR@C;$Q61&R+/395A>:6UZZB,C22-7RZ
  745. XM>;?651L)8FHBCV2^(`9)S7+.[\DAK(M[_2HX@PB/()0=_Z5I1O=7`-CC5K82
  746. XM2OB5]S7,PX.X:+$+'ZH%AXT=4V7!E6>_+,?"U[UHI*$N>L*Z$+C+<[=G4%LJ
  747. XMXVYJB&:O>)-O/E#?L/Y(LKS]Y,1DA=4)2$_I30)=U^M]?9%4AP@/%&0OL4BC
  748. XM0-E#J(ZD>:V1`SUG9[4UOR-Y+2V7&P*BV"5L("L7022OGP5"PD\<8.3'\M@L
  749. XM'VH;G5[HR%.L1#]](JLN%(#8)MLNXDA]F<;@4V5V&B"J!9V*6O&!,=&%0N(S
  750. XMS6$;X8[OG6!\WWY/P*K@&*=SBY`@HE4^"*@")/_D,^]8S1-J=9.7J8@%R45\
  751. XM*0B"E)%+>E''W+$")4?@%LRV?R=LB`&,,Q;!_$O_5K$P0@$`8/*^$P`QL,<.
  752. XME5#&H`OD6JM1BD/($5(J+:TWR#1X%1HM56@LD#RT0/7[&M(@WFO;,O!F%E`A
  753. XM(WC1_@6RS*=(#EJ`D6_^P_"&O&^E+L/+`#3N1'4XS*:F2K#X8K5,+%,'(N`,
  754. XMK+^2CKFHHK*^%*WA\@T"P/CM=`";?CHAA;O+NW(#S*!&:&!X!+0F"2"KW!5!
  755. XM82*CJTX$#,8K&%NB,5(,%:N%.@:F(8)J,60,94/&XRJ$"T&%(R`K7"HLJ!,$
  756. XM]CR940;J@AI.M$//?IJ'1";(0D!2-!:,X@:3,N3FP1UO<^@<Z`-50JV1H!B<
  757. XM=0JJ(R."!!;AO"D+EIOXIOY1<<Z;.:'0@B.&`M5N;>":6JL'K6U!)ORY<4[-
  758. XMT*ZZM\%`&)SR%`^38GLX^!B+)2&EZPF@`JE@67@E."@4D?U9`\R#.P!P`(7R
  759. XM#)*+#0AS&+(W*'X(%,C$4<N.L2`8QJ$`&C,:9$&ST,BKM4XV)>U_@NYNA9;F
  760. XM%H+N8#O:H6UL"@R,\21O1`,$@[`Q1["J8B$U8*B"@=#&M7%O/##"ABL`HN"F
  761. XM:(53@2RCYUH`*F%64`"V@!R@"Q#9+L":HL&A,XR)-Z*6NU*@AZQ&C<H8@A:S
  762. XMP9'(5?`R&:`&P)>"06YJIF(1[`)ZL#BPJF(9XJ9I"1MA(,61<70(=$.C`-#Z
  763. XM&P='(;+62@[J.,!`_8,(:(D@2GRI(#'(>6XU$Q12JMI!C7P7[H`YXRYX(EX%
  764. XMC9"4:*;2Q;0%3>0S(JW>(#@!YDBACFQF-$T(!`[L?J-2O#5.S`SPIS`(Z4!K
  765. XM6/D2`J8E30LFRT?#T!/TZ`X#2&I;_!:S@\O%[-D@/2D?:$J,,LXR)V<GFYI^
  766. XM`X#LT3,/G@K'@EP1*I`*'4@L:/]$-6$0,F@LW##$K$&@*6:U`#`+#-4D%HW`
  767. XMCFR$Q,*B<:T"??I'`')JX@P0F3TO4>G4M#-<XASL56+#E``&H'8""QN@!J@!
  768. XMIC!`!=`HKF`<R:"5%*`$S.Q/<@LC+`),$G'063#*6"Q[82IHJE+KJK(R83RG
  769. XM+UVLY88+?Z&YL".0.L+K#*`;8"!=SX@,%TRX"S`-:\,8`\E@#9C?JC?N;:6[
  770. XM#-X`MHUWI!6@KIP!FRH0CCN#+4S4@4X%D^HA*#@I0`P0=`@;*D`,$'0`.`=.
  771. XM!2'@7`,TLH^,)(MB<D=,\GM!$&8Z-$J-`OM,+!\#,8CW@K*51:JBJ:2;P'"E
  772. XM2]V&.0!%QJ(E0(`M``?H`E(&DJS3%!J%0;^/,0@XUX!`(3HA"?R^H4!(R",4
  773. XM%P0KTWP#99P#XXG0S[R^(=.5W+R.!3Q@K,)0C+H!LZ#K([`O&P\&SKY2
  774. XMJ,@J1HJ6L7`XW&;`D0*,W.$RS0HKQ7/*%+G,[^>2HNY)BP`[J#8/-EF(EW"<
  775. XM`,Z!\\%+;Z@R9/"WW`1'"GM*C0(XV;8M02.0"I`9,<QD2(82M`A%%NL)+997
  776. XMKXOI&#!-ME(0FFYJ-[5.48A.2`*_[Y!@`J2`*H#0&J4*%+1*I2,J-$D^L$FA
  777. XM#X@#9O!($_[:`SKCSB">])H91WGIU$*"9E&S9!W&0QT*0+G3UA8QQLY0ZRP+
  778. XMHZ":G*(>3(!SX%3*+LWGCK"4;BI+S)*S=,-:1@I02`%?\!_-<#?('0N,,L"?
  779. XMHAU4A>W@E4CQ"D8QLVKY4`HH%),B"#C7`+>,D1PI9L0$3Y19RA`4(@5">=)`
  780. XM`"B@T'KNWL7K:X[!55B%?]*.\2G3*'@2(N`64K=/T(OR)1L#A848FF-P%;5P
  781. XM+R!1K,'.C\ZX,_RSAX&F*NQJAX!O)S@#XCB28.%SFY3(0$LCB!Z&`A`FJT`4
  782. XMFK\#4ZO\#(""`\6[BAH\LX-L(?L271P%0+M2P@`56`S9:K;FA$ML\QH'C[0]
  783. XM9N@*'8*^+JQ`<0_LC$".R`)4C*^F)2SXA;(T6$LX@"BK-JUMLNED%+;V("SX
  784. XMA3(Q[N\##`K^AY+.J-C0Q$6Y9_C)*]>V1`'+%`X@2O?@:M/:F(8SP%N+J@*'
  785. XM/*$X0/NV*L$2A</T_(2X;BHXL%2WNT$CB!YH%2MO)^`<%*L)2XOAW0`#<B5&
  786. XM2QE(LNTE-X@6,K&5IUV@).FO(V`-^_FZL`CEP41=Y@0:``9H"E`78V\JD`%&
  787. XMB6]%]:KE$HDN\T'R$(ZJAP`HP*_T%!K`CS#VI@(;`+QI8[BP""5PA-$0@\GF
  788. XM6/BQ`C@%("PP"5H`Z6"4PM=R@VC!GSD$O47]"AZ4Y+ZWI0W<-`2]Q2).!H!=
  789. XMC#V_"77Y5JPVK4WUJN5:GJ/J(0`*#C9)0Q3D#22#9`V3!,WT##=2;<(>G1_+
  790. XMLE3#SZ(3?VSR\R.S-(#GB'(/!H,FI3H`)3V#>&&:&AAC&UB%(C"C:BVC0#>(
  791. XM%C(Q<?!(FPO(DX=F(/L?2CK6@66+$[C#.X%M2Q1ZKIE1DQPD\+#WC`R(3K(&
  792. XM7W*\PB<M`LZ@(3@C^<RYJ0SPL8(%HT`WB!8.06^QB.L9@<;E<J44#J*,*P,M
  793. XM4&%0A^VLI*/')H/*8D_3V=:>!H=5DS3&`\H`92%78C3)ALZX,Q"#QD!A(8;F
  794. XM&%REK9JKB(`+AB^48"Z8MBR1J&(T28=@>)O<\L(S0*5[<?B_F%&VM/".Q6;Q
  795. XME%P7$:IAZ%ID*H8B%.$05`1%R3PB(T")1,$[1@'($_8(0P*BRR-E1SLF5YM2
  796. XM!$*993'($_:(I8UMBQHD%_%$CXOBNHJS;ZN8<?R9THFW,53>`O&NO%F<7IR9
  797. XM#[R3H'XMY\SA@*W`!<OB"Q1E,H;SI@8T'TP#S.`@$",R!OI!6;I2:`)!:[?)
  798. XMWH2?T]%;D`[83%-&AG._/BZ'313L4"@7/4QJJII"J:!,N,2%R(1(@WJ:];H5
  799. XMJ(GADMVNPAX!O&D"J#84(0B``M2RN:H)N`)4.OA!PC,D.X3O(2&0VLJ[/"9Z
  800. XM4TYV@E$JW&QG;A3BP%P$#F7,;@.,+`YBP.<PM+']ND/Q$$R$^+B#6FXSB`F6
  801. XM!(LL?NRG+CL0``_P"W24"V$TG`E3J7T"U@(C@T4M$"I`UQ2`X`4&0%WP`+_`
  802. XMOP#[3"PP\C]@%R$M]0!=LS!A`!A`!_`C+C_)+`E(P=J#-(U-<"PP-:OJO%P,
  803. XM`C:D#(4IR!"RA2RT"@QQ@SF@X3HD\@"#34C((Q27S"ID)!D_#!'C.6RGED1\
  804. XM3HT2Y^I$G<O9L"$@CF#H&)*"\#DUBG%:H7:H9X)KR`F:@*QR33&V!#QI*-;8
  805. XMAXJ-9&.;B^%BILIC(9HU5`ZU"S!".%"`JZ$2++<^/Q9AF8(6Z\JS!>681MHN
  806. XMGNCH*#S6KIUH[K@]V*Z-"/%@/]HN,FGW($%,$.V(&9E$NA#H0S."1BZ13>3N
  807. XMH"^>$3>D#"E%-*.GQ/_X/"(1J(0J<3\<D\C$,E$`BH`J)C!X&/@$<F64$?``
  808. XM`[\2I@PJ3`95P9HH#IH`*R&+&'S"N\IN(A`"ZC:FP7N@#\:(T.94B"^&.8VJ
  809. XM8F08+(K+0"P8#[*,`T6&P^>&R=KK]O*]AB^GP$J`M2C"OX!<^1?J.5^N0VG!
  810. XM&D9Y`BCSS`ZRA4SN(001P460CY0#EK1NRE<YV3X41X%-H"R8LHD,!"P!RT.F
  811. XMI?0:\#@^3Z[O8K_>KZ8@&$NF9KO:KDJ8"(0`(0CMVZKZL:FIBL(#U`JPS\32
  812. XM:LPQ``[/8Z6D.,;F(&`"H0)T[7)A`^ZM?FQJ2@[\"[#/Q'KU@C&4H-T1&"Y!
  813. XMJI"N@@*$JJ*JP&H"XL(FP$H8I0;.J;'@2_BBNX;/2L`L3`O7\E:S_Z3,4S'O
  814. XM>@C@`'BR&OQS5+1O9=HB?FRAB<!G#!J;Q3NA/G##9L:>4IY3&IH&>^N44J7<
  815. XMLC01AI(T9C[Q#.<):G(%/C`,^!4@O522.QD%38M=0JBPJB28_N__"P"#P35`
  816. XM:<DC6B,%H*>4YY2&IL'>(B$K+`#-:)ALN#D7\FUT#U"$GO)?\V)6R"`20#,:
  817. XM)ANT;ZNZ$VX:7D(C&P\PB);1.'QQ7@D+PF:()]>&&=%>B00)R]%P&B.D,$F3
  818. XM(1E*V]:`I8UM&PU4.A3QQ2F!\@(\``_``\2$.0$/P`/P`#P`#\`#\``\H"E(
  819. XM45Q+E"!@#"K^G"8&SPB>U)N-P"88(^XG/``/P`/P`#P`#Q@G+HL4)0OD%L85
  820. XM(HN8(%?^A3\RH9(T8I2C:G2H)7`A1Z$)R"H1@IW`9$B&@B2V;6ECVVPI%`%G
  821. XMF5ZV`R'JN>Q5/`.&:W@[YK#*&0$%(`(N&)HFTB1;?JQ,LI,,)9NV($O9^QUJ
  822. XM-[4N?!"JBBJ*SQ,<8@HIR8:;2R_!B&"K5>NAP!=)13D9^HR^H?&Y9"D3148E
  823. XM&;(>E[:_2H28J5:[R4PXB#((P)R@":#:8KN\4J4`RDBJI.R86U4:`X6%&)IC
  824. XM<)6V*DJ#`E0Z^$'"8Q9(*3`S,&3Q#I3%$#),"H>NGX"R&=-,0?*.0\L8F@`K
  825. XM07*Y>1X"?JS<,F(NA-^@S504U+8U8&ECVT8#E8Z+T`@4EU],&+L:*L%RZPUD
  826. XM,9@I:1&?V_+."8A&+9PSO9?P!=]L$Y$&Y42D(/66AH^NP,IB<(?&HMRBHO+-
  827. XM%0H%@,96AR4J/H@-ZA44<0IP#U`$*J!M(2J8*6G1;$D0K@Q^(9Q+,W+*3^JQ
  828. XM^PW4&27*HTL,H@8J0$?9L=PT08$*>,H>`C/`=]"AG@FN(2<(`J``M0P#>Y`$
  829. XM/&DHUMB'BHUD8YN+X6*FRF,AFC54#K4+,(*)II&VBR<Z.@J/M6LGFCMN#[9K
  830. XM(T(\V(^VBTS:/4@0$T0[DHY4D5HC.@(!5H`$8XFZ*`LLR^!WF$2Z$.CC0VHY
  831. XM:`T/"018`1*,)>JB++`&BM\!&KE$-I&[@TWB0H@D^N(9<4/*D%+D0[I$'!(M
  832. XMQ/_X/"(1J(0J<3\<D\C$,@'H;@?'(`B``JR,&!%5=,W81(Y/)YL1,;'%*>@J
  833. XMNH"^+BS8`@%`F*P"4=!19L+^SS\Y%)@^^:Q#]'(8`E]2@CQ;U@4X<[E*H,X)
  834. XM$+`$G#(!A+``TOH+IJ:JJ<',*\',R^_1(!.:`/VN3#`9?,NY14NC]\9#J[!'
  835. XM*%X"`KV0K@()N!:U<)@P&=:#A$!JBQ^:0U1JG_`C\3F)"T6X';9'"V%E,65@
  836. XMJNG0.QP/G0*J+7YH#E&I?<*/Q.<D+L'B=M@>+825Q91YM"2MP,L['`]?`BC`
  837. XMRG"I3BE5:F0LLXR=Z1!%N!VV1PMA93%E'BU)"ZDTO+S#\3!A:ZT,OH0ONHL.
  838. XM-$-)3T9!-]^`ZP/JT_)2&U$P7'NM0H?%T"B,SPXN\4"EZV*./$Y0M1@69+@A
  839. XMQH\L=J9#%.%VV!X%*I;%E'D.J<-103QL#@(\!"\P>!A`P5&P+`@(6"^S@7'S
  840. XM(H3!J2!@NZ6&H%CHM3I2I@@JX0:87:(3DL#O"P>!&@$3,3!E0$:;IJ>D!E$I
  841. XM0<6/+':`&M\!2DM\;@<_#6>)_%2*9X*W7!(2@H!@+8L=EH:Z8>5I%RC)E*Z-
  842. XM0:7VG0#.X+%Y()ZMZYDC8LZ;DL>62KJVDV+'\:-8/$)M;G%J$SV4%HS]41-I
  843. XMG,9`84G*`,3L4+`@$V/&5I$*L/("00H0`Z0/W+!306P#(V"Z!2A=A"5CG`/C
  844. XMB=#/KA<4Y@R(XV(=S2]L<P%4`+'M#G`!5`"Q#8QP`50`L0V,(%O0%@%)(X@>
  845. XM%+=U01PR'S5#=2NT.+OJC<_`41/GTHR1R#VXC\PB(0FU:`JD(_9"01B2"(JF
  846. XMX%)J.10$-HD+Z2]"$I$MHMA,Z+%[+"9\)NJ&V(:FR0,NA>'J,YDRWCP)*DY,
  847. XM4?*$/6)I8]OJ+7[JGTJF2$/5,)*86.*5$DZ=$1*E`$!+LL`D0X-;ZB-43J9#
  848. XM%*$Q4%@L'!G+.CAB[LT_2$XT+6(4#T51"_-$P]-0V7@XN+'01IYH)"$"-9'&
  849. XM40%VM:\)BU!8F*90YI)"IDA#.<7&4`&^1">B*3`M:JU-T$)DAT;#U'!$.2<`
  850. XME`(E*)@4+<6*L"DP+5X]1HK/'`U3PQ&%HEE.2C/3,-G@%H*QF6S<8H>`&EIE
  851. XM,;!@O)BFX(0Q$A<VLR5!&!9,F0VAF-3#8IEA09*KLYJ=`VOPBAV6AKJAE&D3
  852. XMSXE73XJHLYZ7B:`)\'PD%]"$=>AU8IGI$$4PJ;P&!V%Z`_P&H6KE#X3S:!I>
  853. XMR':8"J<TU`UGB?Q4"@%O,]FY9@+(H-@#AI*O0"%/<",<")@"JI(`:1RS)4&P
  854. XM^]H%2I+^>C7V(5OCV4AI_"F`*C546V0&9H*98":8"6:"F6`FQ(1;@R9B#(23
  855. XM9H*98":8"6:"F1`3L*.LP^H03IH)9H*98":8"69"3,@ZO"&4IO!@)I@)9H*9
  856. XM8":8"3$AI8$^:**K0SAI)I@)9H*98";$A%L#\&`_A)-F@IE@)I@)9D),8#F\
  857. XMH;AC>^B@;`UF@IE@)I@)9D),R#J$$UQ#."$5;HUF@IE@)I@)9D),2&G0HUI#
  858. XMZ;"*;`WAI)E@)I@)9D),R#6^@"_@"_@"-J1E(K+QACJH7(.98":8"69"3&`Y
  859. XMA).]X04``;@`O8$+^`*^@`V),1!.@A-20==H)I@)9H*9$!.R#N'D[1!.\):W
  860. XM@\O@`KZ`+^`+V)!``"[@"W@!V`]:0SAI)I@)9D),2&F8B5J#F<@ZO"'M@0OX
  861. XM`KZ`%X#]J#68"6:"F1`3=@UF@FX13E*:H8,FVC6:"6:"F1`36`[AQ"VZ.H03
  862. XM+D,X63I8$:LH'Q).F@EF0DS(.H239F(?$DZ:B67"&V(,O"&!@/W`-9@)9D),
  863. XM2&F8B<@H'V(F"HYFHN`03IH-]B/7:":8"3$!UV`!LL*L,"O$%9H)P$,XX3*$
  864. XM$[PE\&`_=`WAI)D0$U@.X:29N!?``#]0.&DF@I-F@N7PAK(.;RBE>4Q8CC%`
  865. XM3,@ZA)-F(C(Z:9@)OT,XP3J$$Y1FZ'A(XHXQ0$Q(:9@)]"C78":4CF9"Z1!.
  866. XME@ZE`PN!1E`:,6$?NC68"6:",1!.FHG@I)E8)B*;[:&#@DQF#3&!Y1!.F@DQ
  867. XM`0^`2*`1QD`X:2;P`(@$&DEIF`D\`"*!1HZ.,0`/@$B@D:MC#,`#()*(9`S`
  868. XM`P!#:(Y0^::V%T#+FG38\JE_*C546UJ`)V)R!,BFKZ6KV`%JBLDP$.JB*\T6
  869. XM%E/^.6'8FJ8.16&`O@;\)Y99#:.,4D(.^"M01#KS>TEY6#P9DTY,40A`GH&O
  870. XM68?,E@2!8Y2@IL,#934T9;"NA\`,&`K"1/;.GDH/5H>944W<L%@':FL\X!J5
  871. XM$YJ*;AR".,::I8>0%2D9!:`B4%A0F-"`L&0:D((Q`A9#MIHML>5L"0>;"?M(
  872. XM.+F/B"+W`$7X'$LA!FA4Y!9BF0U!I6LFF(G][_\+`)&-FJO*X/C\(!BJSI0H
  873. XM445',DV4$Z.,@TL=HALWBYR'F;@-F@D%0;%K@VJ_E8(Y*-=VA:[@Q0P<Q(0>
  874. XM:C)H_OJI?RJ9JAO5"^$D\!!.N`SA!&\)/(Y!H4)#D%#<@V;",A`3F@G+0$P0
  875. XM3L0`,<$R$!/$`#'A6U$3Y<2;J\I(,.RI-L`TX/3F1H`AK"._A+%*;N/``YZT
  876. XMQ&>.2?5V,?'-)V"K_DF7$9K,-*&,4F)X0PD"@L[BK$P7?P5(3S@8TT@"\:`-
  877. XM4.EBF:$RM)$.+`U'#61D*1&5GG),,5N@+!`FJT`4F@(5H*=D+O2X*.[.8Z7<
  878. XMLC2Q6E$!<BC+(=-,-?F:G>`,B.-4N?9Q\X-]MC,.30),I:P%E4Z)P?LB"A5`
  879. XM;+L#7``50&P#(UP`%4!L`R/(%K1%0-((!B#X)UYP`52`>$&24`'B!2$2!>`@
  880. XM![S?8>B;&WP5_D_E*2UB`G_N%M*G_JG4<"J@&^V8%\T-6`-T!3=@#>!GU@"T
  881. XM8`V0.E0M%.9(5#%`&SP`!F)]Z$;9,H^9;(8%FJI=H"1'`VG(17,#UH`P0$Q(
  882. XM#M:`,$!,<`/6@#!`3%@#P@`Q(0P0$_``]B,J<0/6@#!`3'`#UH`P0$Q8`\(`
  883. XM,2$,$!/P`/;#UG`#UH`P0$Q8`\(`,2$,$!/P`/9CUU@#P@`Q(0P0$_``]F,?
  884. XM.@O$!#R`_=B']@8\X)\$`MV`-2`,$!/,E@2!@QSPC*\RP0U8`\(`,0%`0PT?
  885. XM!A/E(2#JQ+7_K)1:`\(`,<$-$A/F!#S`50Q;D@VZ<0:$)+&V:5+/!`*?.5H*
  886. XM1=B\?I2+DAE#`J(7G0M@U"HZ&I@"JO+%A+'/L#0L(<.69(-NE!2-+0&O*8"Z
  887. XMDBM^*S$+`R`*1H(_"`,@"D8B#(`H&`G^(`R0AJRA2W`;<C:*#?`D9=J')B:5
  888. XMZ2OA2K82F0$\V$K`@ZH$/"`V9(9WB-AXAXJ-=TAO@`-DAI7HUYHU?JVB0V;8
  889. XME\*`K"0,R$HF)I7I*\DU&A-C0RN)%KH2\,`JV2GNA7>H*F$DJA)&@MB``V2&
  890. XME8B1,#T8"=/CUY(9WJ&]X==ZA^Z%7PL.8#]NC8MJ;X`#9(:5Z-?2-7XMF6%?
  891. XM^K74CE]K^9B85*:S0/F82B:FND`KB19P#8ABI[@7WB&NA)'H2A@)JX21D!E6
  892. XMHL1LZ$C,A@Y&@B;:EQB),,#G8"3"`,?$UOBUEH^)264Z"\`2HJ,Q,3:(#H@"
  893. XM/&@V(`KPP"O9*>Z%=X@K821P#8B"D9`95B*(@I$H."`*1J+@2,QHHG>H*F$D
  894. XM+BH5@9'@#YZ18>/7>H>N/#A`9EB)?JU?2V_XM7XM]N/6X`],CU\+2ML8^C2<
  895. XM)?)3*9X)WG))\&!6/+-NGEP:>,O/CT7P*SN&7>U*"0CB1&OQ;OBF.@YEXL[`
  896. XM9#B9\Y`]!(9@G/Z&I_PM["=@9IB)<`H/#(?$J0O2&ZHGJ9%JK)JSYPG"@K1%
  897. XMWH=;<-+*&C"Q+G@9LS<V$?ZY,GH(6?%.I#/N#-8F/[R?V@#_HE%L@G@4/8*[
  898. XM47/>G#E'S_%S]BA$`@^0"\ZOH*`K*(4`-*.ATEP/X$F((&QX)B065@\F4^G6
  899. XM+%`.9I0>K#NI@(@0,/$&J.O%`1G#156K6!#&*LWU`)YL)FG&I5`+!&=&PR/B
  900. XMDUL-)2J+ZBE[",R`MP"*.+U<+>^1>7-Q:+3[H<I;XQ`$0F^-DQY*JHY!HXLS
  901. XM.[GFC]G$&]:X<8MF)*GZN4W&/&0/IX(I@+]Y96896)-D$68BG`M'#M@!"@\J
  902. XM8.KY*\`#JH<-PDJHGK)A"C@GJ("VY86L\M8X\(J\>C\>F92#9B@2@[[0QDL$
  903. XM`LM$L&$*V!./"/%O#/@KU+I,<5/TY`J/*4!D2@'VQ".B8U#LG`TJH&.8`OP+
  904. XM.J-JZ2GS@!LP3XD6J`"RIL7\3.J",E%F#!NF@/R*"K@-5(LV`+V!"\R&_H;`
  905. XM>1*+CNC$'YO\,)P4P+\85Z"&Z/$^O)^<M.[F):"^P`,>A5P995`X3$_)*Q/3
  906. XM1#DQH^DAZLHR`L19<]Z<[6JPK`]=,&+HTBMVWBM)I]+A-`H//`=A.756G3.'
  907. XMZ_KDI@"125E"$4P&OJ`K0`)&+K7"K^P8+!@O1AKB9)86BL7^DS)1`"*`!6@#
  908. XME"7""MV+:H;$6D%D0HF,IV*G\:JV1`B3KQP#O2B*RW`SC"C*FI?@9;NE)I67
  909. XM\7Q49PZHS%""X@]#&VUQM=E*_`O!H#+X+5$`(H`%:`.4)<(*W7L)4(G%Y),[
  910. XM%",T<F5\V"Y8!)RBM:$NL@L@D+M1<]Z<.4?/\7/V*$0"#Y`+SJ^@@%;18N*M
  911. XM,#+(-!F2(6VARB,ECPB4LJ6LHGY#9^64XC94NDM0+?10%#64I4QD&$]$WM'#
  912. XM*`PH%H_P7Q08W0!S@EV(!&T:M<+QHUBJ*+3/:.,=/8S"@&*)S-H8"P;>`B.#
  913. XM3),A&9K?U*OJ!*5L*1^.S-#)R0_OIWQKGT#[G#)>BS#(WK8?*(W$:ZT,OH0O
  914. XMNHL:`@*]D#-IK0P^(DN72^7P.36*6AGFN(7X;8Z1_"@;Y([RVM6^IE)&:D,1
  915. XMFH#<3I=+Y4`;:F68LZJ"`"C@G,@"AH)22#B(,@H^(DN7R^=\A=MA>ZP/ACEN
  916. XM(7Z;8R0_QZ`)H-I0A"``"C`-3@6@9M'!';;'^F"8LZJD-A0A"Y@(H+'588F*
  917. XM#V(#AJR/5./RN4$H@6L.)9>'H03*"YPY(L:/?/7PN9Z@*9!<:L'U)Y4#;6:<
  918. XM$B@O<.:(&#^RV`%J2@2FJX0$^H*:10=WV!Y#!P3.>HS;G,.@IC1+S98R?*N6
  919. XM&H>ZPR6*.C!._@(]XJ\(&Y"VI@W?,F[<@WO.EUMT<(?M,728<2+-8@$>M/V6
  920. XM,O9.U,()2+VEX:/;#LX#BNJ]4Z&"`/B@@7R=)(WO@3,P#SRXFBT@X.\\-MAG
  921. XMT<$=ML?087@$;6:<#"\A"`BT*RRK'P/(3*J'H&.@$I2`ID!RJ5PD.1EGFJP=
  922. XMIKB0@CR1</0X0>4<$V:&/J,/,S@(%LZM"N!DV_A,JNR#8;@0A:8@(,`RR3MW
  923. XM4!Y<';C-;W/<U&,*,H1,=&APJ,*L$,VQ9[X7G``PU!,:!'(%^)(=E\O#("!X
  924. XMM[8`&:`+,!,&2X`'%C.SI)3\3+"@)=(HM*HI"`*@`+5L:(N%XI@IRK0(#'X"
  925. XM%BTZ(0F,D[%@N62K/*C``%QKWQB);T48ZC8ON]]@ZJNIWBU1T'J\`^L&!0!G
  926. XM!`SUA`:!7)$#U(JA\;ED%?@*@^)#X0\*S)RNAP0BMX`9H`MX,P4A0R@S`ABU
  927. XMBKEI%US;^,R>8(UK+(X[`V4*.">H@%@L"[#(:!I39GO45-[``J,F4/P*`XJE
  928. XMBJH!@XP5<:4CJ6`Z&LV:=`RF@*)GI`@+3`+PH3"@6%S*;R5LH`*Z@LSH0[FH
  929. XMTBA%3F=3*Z9-;+/>&O=FE(!S#4"H?(8T2E$HI!2`Z.2W@"A+E#,,O$*P,+\R
  930. XMH;K#[D0X'67'<M,>B"IOC5NO9HH(,G`8#_PIVB%;3*.N'Z3-8@`XV;8#!@EX
  931. XM&%>'[@5\`:_N*35*%.RF`H>*("9H`:X`OD`S:P&&@$SS5ZF"4H/DQ#9P#P3+
  932. XM`*[`J`E\%<_L($N_<``8@`;``7*`/S`/^"U/!0+0@QOFQ"%3!IQ!HX0LRR)1
  933. XM\2O].^UQH-OG"H\O($.2_+Z`#,FIB@&^@`S)J9(!OH`OX`OX`GJ#-^`+(``]
  934. XMN"_@"_@"K(TYX`OX`KZ`H4H-B`&^@"_@"QBJU``9X`OXM>BY&.`+^+7H.1G@
  935. XM"U``M(`88)1((V@`&"`'<,)R`!J`!E`)C+`:('@YCFX`'`##9+G6!QK@!J@!
  936. XMQ!W?Y08`,6<&$%/=B0%L`!@`!E@)(B0:0`E3"F``'``'B`$4`"W@7*(!;``<
  937. XM(`:XPFJ`&R`+R\'6KQH`'[H!;@`;(`=@N8('!)(&$'<PS!H@!\"'@A<8@`;@
  938. XM7=8O'*`&D`%PH@,2!K@!CB.3226P`10`+2`&L`&^@"^`!@`Q=Y<O`$Z2`6``
  939. XM!/(+."!A@!N@!L@!OH`OX`:X`6Z`&^`&^`*^@"_@@+0!:(`;X`OXNV2`&$`&
  940. XMB`&^@"\@>($!:``<X`N(`787$#,'^`*^@`,2!K@!;H`OX`NXEV(`&R`&^`*>
  941. XML2O@"_@"O@`:X,*D`6"`+P!.L@%N@!Q@!O@"9`#?!0>P`62`+^`+P`$PS!S`
  942. XM!O@"OH`OX`O``6J7'.`+B`%L`!P`Q)0!OH`O8/V276:`+^#"S`%,(AO@"_@"
  943. XM9`#9A0;(`;Z`+V!3D@$VI2^`IX`"1@FEX`:``1!(+"P'N`$P3-KE!I`!8("J
  944. XM"P3``6B`&@`'&"6"!Q@@!S@@A0>5P`8`,6>&+(S:6;]H@!J`!CB.3*(<P`IC
  945. XM'W(`&B`&*,2"`"B`Y5(*8(`;X`9P7;(P&(`&L,%L@!A`=KF(;H`<@`8PQO2&
  946. XMX.4&L`%&"94`!L#-1@GU"P>@=F(`&0!.D@%"(QF@=%F_U@<:P`8PF7@**&`&
  947. XM^`*^`!H`!L!=8H`O8$22`6*`&P`'^`)D@-TE![@!<(`OX`O``6"`"],&^`*^
  948. XM@"_@"\`!<``9(`;X`F(`&^`&P`%R`!O@"_@"UB\<X(#\`F*`]:MVL0&^@"]`
  949. XM!BA=@I<OX`N`DT8D&.`+4`"R@%&BA;`!<``<``FS`>"D&<!VV5V,L0OS7L`!
  950. XM8``<(`8XCG27&*`&L%UD@!C`)(H!CJ/U"P>H`7B7X"4&N`%P@-#()%J_<*(L
  951. XM#`8PF12`+(#E:B%@`!S@!G#"9``8P`:0`4:)`Q+$O`$8I1O`!I!=JJ[@(0:0
  952. XM`62`WP4'P,UR@.-H_<(!:@#>)08X("^OBT@&*%UJ@%$B";,!C#$%(`N8`;Z`
  953. XM+^`+H`%@`!H`@?P"?!<;``=8O[X`&:!VP0%J@!C@"_@";@`;P`;(`6J`+^`+
  954. XM^`*"%QH@!H@!OH`8P`;``7:7&^`+^`+6+QR@!L@!OH`8('@9D6:`+^`+D`%*
  955. XM%Q'S"_@"1J0;`$[Z`ER->^'7HN=F@"_@UZ+G:(`OX->BYVJ`+^#7HN=L@"_@
  956. XM"_@"OH`O(%?Y`KX``.4,&`.^@"\`0$DIOH`O`$`Y`^"`+^`+6-HP@B]``=`"
  957. XM8H!10GA`EFR`XZ@8@P%8`KW!!K`!;H"+2`:0`>"DT(@1LP%D@"E,>/B[#D@O
  958. XM*0?``8XC&:!VF<*4`AO@[RK$M(!S20:0`6(`&R`T8L1R@!K@.&+$:@`<X"+Z
  959. XMNVR`'*#JNA=L@!'I!CB.5(+@)32276*`&(#EH@ID`!B`0IH!<@`;``8HQ+2`
  960. XM&,`&^`*^`!E`!H@!;(`9X`OX`KX`&R`'J`%N@"_@"_@"0$P<``;X`KZ`O\L&
  961. XMR`%J@"_@"_@";``90`:(`6J`+^`+4`F"EQG@"_@"9)?@!0?X`KX`E4`&@`%R
  962. XM@"_@"\C"2A<8X`MXQJZ`+^`+^`)D@.`E!Z@!OH`OX`NP`6R`'.`&^`*^@"_`
  963. XM!H@!;(`<X`OX`F(`&P`'6`F^@"_@"P`Q+TP9X`OX`F(`&R`'N`%L@"_@"Y`!
  964. XM9``90`:8`;Z`+R`&P,UR@!K@"_@"9)<;@`:0`;X`G@(*&"6$!QF@=@F-&+$:
  965. XM(`>HNNX%&R!X8;FH@AO@!NB+;@`:``:P`7"BOPL'L`$8)=E%)<")8H`;(`>P
  966. XM`48)+.P&P`%B`)X""F"YA`<8``>P`2@D1JP&R`&JKGO!!@A>6*Z4P`:X`7``
  967. XMENM>L`%P@$V)0HH!;``;@"4('F27&(#E2@EJ@/6+4?)=:(`8H!`+`J"`&>`+
  968. XM^`)D`!@`![@!8(`OX`OX`D#,',`&^`*^@"_`!@A>;H`OX`N(`6R`&P`'N`&^
  969. XM@"_@"[`!;H`<``>``;Z`+R`&L`%L@!Q`!O@"O@`9H'2I`6*`+^`+B`%J@/4K
  970. XM!_@"OH#=!09`(+\`!2`+&"6"AQC`!H`!*"1&C`:@`4(C1@P&4,*H`AK@[](;
  971. XMC+$<H`88)?PN'"`'.(YD%QL`!CB.5`(:8$*B`6``&H`&H`$4@"R`Y0H>8`!D
  972. XMJ>JZ%VP`&H`&"(T8,1A`"4L);``;X`8XCA@Q&R`&B`&.HQC@!H`!;(#02`:X
  973. XMEP[(F<$&L`%B`)8K"<,P;0`%(`N8`;Z`+^`+D`%@`&3)!O@"OH`OP`:@`6@`
  974. XM&N`+^`*^`!L`!MB4OH`O(`:P`6R`&P`'^`*^@"\`Q#29;H`OX`N(`6X`&,`&
  975. XMH`&^@"]`!D"68@`9X`OX`F(`&\`&B`%N@"_@"\!=?!<8X`M("+2`&&"4<*Q6
  976. XM%:@K!A@E,K%(I]*Y\](,>\NA-!IH`!@@!R`Q`Y44P#2`#4(GG:U@$0-B`+2F
  977. XM"9CXG`(K`39X`]DT(4L.4"OF`!"B#)`R`109BY8``;8`&L!Y?+H&N!G'WG(H
  978. XMC0;?!0:``6``U&5E00$LO1+.9*!BA`,CI2F)`7`S&``&@`$<'V,'XA$2@P`H
  979. XM8)0H"X(`*`"`R^(<'8"3;7LR,P89X,*$`6``TP`VT,CV@X*E#9`!+DP8``;X
  980. XM*X(`*(#ETJ[HEH`308LR,P804\2<`?R+(``*@%VT*[HEX%P#C#HI,V/P76``
  981. XM&``&Z&0"@K)`MG,,@@`H`)&$#<BN@Z(K"`A@1I*NA.LV+SMSK(I"#9XJ/V).
  982. XML#:8,04`"\`"L``/Q5%X"-2HD>2-"`E`$[_O4)%1'(W""8`(K:S"'L$&R!22
  983. XM`QX+-E@2YBHF0(F)8OJ_;BHA"`C6LIB1+H`'9T1\$'I0RJQ*6VJK(<D,E$-0
  984. XM$1RC.@3'HGL!7[*NQ:TYI*D@RFW3V[SL,H1E$`FXK"R-/S#BPANHA!L`!V@!
  985. XM,H(\@/+[[)XT$`"$J;$^!G81TB(E2#04X;*$#-H#@'*0DFP<O\A/I2`=EDL0
  986. XM("``SQ"9"X:FX?]B1MER"VQ*1A(%HV<(!J$JFHKU(MK6.#?N'Z.P=@)?H5V(
  987. XM)]&``BL02J6(/]9AN^37:,8TBGP,*?X*%2UPA-$V2IK1'O-7)!NG$#`[$J2I
  988. XM"P96,1&J&!0Q(.BY9L;)Q@Q##`0#XXO%6Q>"JD^2:@1J%AW<87L,'89'T&;&
  989. XMZ>%$'P>!782T_@)^[!_C7L"7DG`Q"`A2*E`A+S@P3`95P9KX#QZK5>65"`*@
  990. XM`%9-TN@LO!7Y[)6`)[LU[D659/8V$WI,"YP99X=^RD@#02S`###LR]JXA2Y&
  991. XMS0+EW*^)``FXK"P-BVS.>X-(`O$@9=L>WBU6,#XDR1P#D\&W',/0L)(.95#,
  992. XM[@RTJLL;N-P@JH6RN?Q"/\+O6MP>`@)1<")@`OB"JXEZ`1@%QH[`L"+\F(K)
  993. XM<$_[L1*49H>.T%NL.^QNNVL?<X,MH>)B$_Z*EG%NT?[>2(O@6^CM+CL!ZML3
  994. XM]QP#)."RLC34LJ-%/V/)')V`P,[",DN]""485*.Z%_"E)&3*Q+WV``FXK"P-
  995. XMM<R?#/M@-,1@LE$9\,PG!S'[5O*M)3+0LC.D@U)%48"Z`H*'@U1``BXK2X.+
  996. XML2P2%1E%<GD82KT!BTUP++H7\&49B]+8-H'15#D#T*IU(3!DTX0L1>%%B]%B
  997. XM.U^G[G$#H"HE8+W*"7!'B\ZJDC24Q6;101`LVBUTJS=`JV#'K$*-W`Y>"4L#
  998. XM=U,6"*PKCYZ;`_X**2!$@0H0`U`F)K`T3`.KRLY0PZP#PA*-$K(L"\QP,PP(
  999. XM,!@V"`1``BP"#04ED`@H`HN@4]@(;LH'Z1"4M":T"F%.L*H"@S-@J7@#N13^
  1000. XM)6,8NJ++T`_2D%,:"Y)`Y8/2\"J^JFWA)O^7)N`*"`*@@(#@C0@):D'.ZK-*
  1001. XM""*K.V&;BL68`%3C(6@*M``JIBD0--@`J6!H4PEN@-E%"Z!B'#)4XR$@T`8"
  1002. XM1&'M43'@)Z2/$UP=!$98KF>@$DB)?HSAFP!IG,Z.57/6J#4JP4P8TT@"\>"H
  1003. XM8@E_AMFNML/M4JJE#2,P+[^F51`^?-#<@TX/,%@#:H@W0GY@IN@'NLY,B#)*
  1004. XMGL,@@)-Q?+'SRW'B$#_$-04%,+;P25,";/*G@`*M+6.(3D@"X^2QT@)"P0FK
  1005. XMSJ0,P,S`$49KWS`"\`4EV`)B`.<1!-@":@#G$038`FX`YQ$$V`)B@!B@"_`=
  1006. XM2"$VX&$@#)*3?TS`E*"HA!&,)/#[3`.!$9:[[9"^R05]7-JP(!<A9KP;\0+S
  1007. XM\FMRU\JH]>H^;*>BH'M.GW/&6I3'`D40-,X`2\-;N*;0GOK`5YD=!@)$8=N+
  1008. XMM"`"*F$$(PG\/DY,)<`!:`#30,=RT]C"J0U%:`*N@*&ME,#<KIF?<D[0`JB8
  1009. XMRR5CHPIN`-YE"[`!N@""KUSQ-)U`+6`$(PG\/@^E!9,6*0,PK4`)'?"Y+8\E
  1010. XM)$TJ0<Z2#/@K8J$>ZB$`"/T5IT"_(WX&`^0`#TC_/,M!3[T*36ZA*8)*."1V
  1011. XM@E'J:^H85)6RX9KYI-P#%$$+H&+,A"CC6R#).DVA41CT^X1&Y``H0*MBL:M+
  1012. XM6[&XV`3Z"T6$`6*`"]./F!-@@!C@PD1=OA4U44YL&&%&R1"S@`%B@`N3YUI_
  1013. XM'C]0<K)!"T;#U'!$@3(<S6W3VPPW&TR=P,X`"H@G@^:4BD]^!YX""J@HMJE8
  1014. XM[%10,):HBY)$&.8J,Q<!OYK6?)7982!`%`X#4X9?4!T>I!PP!\`!>!<4X`=0
  1015. XMEE"$G`&;*A!\E8%,+!@($(7#P)2)A=`H(<O,P@KRA80@((@I$DS][R^X$U`$
  1016. XMJXI:@BA`QP:!7#'NQ(*!`%$X#`("O;"*(@*X*(#&)+H*5@(8X*_P&=*HY4?M
  1017. XM6GG^.P*/(V@?1RF)A;`4!3L&W-&B@X+FC\,'=[3H"JVIZ3#8`B[,+F"E2RMB
  1018. XM`@4@"U2JG*KRL?>;ENZ-+@;83!P0%1G%K^3X*L#I\::@$J0`88Y6$!T;!'(E
  1019. XM?/`.&HDZSG!H)`Z#4R$@P&"&N0HQ>AQ2QI3K3M@Z&V2V0*-%J0Z.*KTK,#@#
  1020. XMEHK#8`N(`62`+N"R.!6H!")`"%#+AKD_2]":;&9$]V`P,/A(@L;"=X#2[!D,
  1021. XM,,!*"+*`NV!$^2?N@A$%K;@C3*SC@&(1%,ZQ@B]1B`^D2R@+"\`"L("$8`N(
  1022. XM`;J`>Z$BB`F:@BN`+]#,FH(A(-,,+3$_'"]I\EI4`AP@!U@>98`NX%ZH""Z"
  1023. XM/,(@X"L,B@_EH@)09"Q:XBI8"6"`%B`KB`&6QQF@"[@7*H*+((\P"!#''[+D
  1024. XM2IJ\EJR@7]D":(`NX%ZH""Z"/,(@:")`B#)`R@109"Q:XBK(`7"`'&!YK`&Z
  1025. XM@'NA"6A1'@L40=`X`RP-T7+S4P^2)J]%)<`!;H#ET0;H`NZ%:^:GG!.T`"H&
  1026. XM:M,";@#>I<&!'UM*-@[3O`IR@!N`!]L";H`NX%[@%U2'+1'S@_&<JJL@!\`!
  1027. XM>+`M``?H`NX%W-&B2R96/M&2,0.J9"Q:XBK(`7"`0HQY[`+N!=RQ42N`2(+H
  1028. XMY+>DT#`TMNHJ6`GZE2W@PNP";L=&K0`B":*3WY)"P]#8JJM@)>A7MH`8(`;H
  1029. XM`@*-%J4Z.*I$R\UO%7RJK@*M8'F,`62`+B#0:%&J@Z.J`"()HI/?DD+#T-BJ
  1030. X&JT`K4```
  1031. X`
  1032. Xend
  1033. END_OF_FILE
  1034.   if test 22480 -ne `wc -c <'ycoding.uu'`; then
  1035.     echo shar: \"'ycoding.uu'\" unpacked with wrong size!
  1036.   fi
  1037.   # end of 'ycoding.uu'
  1038. fi
  1039. if test -f 'yw.c' -a "${1}" != "-c" ; then 
  1040.   echo shar: Will not clobber existing file \"'yw.c'\"
  1041. else
  1042.   echo shar: Extracting \"'yw.c'\" \(11121 characters\)
  1043.   sed "s/^X//" >'yw.c' <<'END_OF_FILE'
  1044. X/* Placed into the public domain by Daniel J. Bernstein. */
  1045. X
  1046. X/* This is the source for BOTH coding methods! Y and AP are both here. */
  1047. X/* Keep this in mind when hacking the source. */
  1048. X
  1049. X#ifdef WHAP
  1050. Xstatic char whapwarning[] = "\
  1051. XWARNING! If you use AP coding except for instruction and amusement,\n\
  1052. Xyou may be infringing upon a patent.\n\
  1053. X";
  1054. X#endif
  1055. X
  1056. X#include <stdio.h>
  1057. Xextern long atol();
  1058. Xextern int getopt();
  1059. Xextern char *optarg;
  1060. Xextern int optind;
  1061. X#include "bitout.h"
  1062. X#include "percent.h"
  1063. X#include "texts.h"
  1064. X#include "huptrie.h"
  1065. X
  1066. X#ifdef WHAP
  1067. Xstatic char progname[] = "whap";
  1068. Xstatic char progged[] = "Whapped";
  1069. X#else
  1070. Xstatic char progname[] = "yabba";
  1071. Xstatic char progged[] = "Y'ed";
  1072. X#endif
  1073. X
  1074. X#define ALPHABET 256 /* do not change this! */
  1075. X
  1076. X#ifndef RESETNUM
  1077. X#define RESETNUM 8192
  1078. X#endif
  1079. X#ifndef RESETFUZZ
  1080. X#define RESETFUZZ 30 /* XXX: any suggestions? */
  1081. X#endif
  1082. Xstatic long resetnum = RESETNUM;
  1083. Xstatic long resetfuzz = RESETFUZZ; /* when in doubt, pass the buck */
  1084. X
  1085. X#ifndef NODEMAX
  1086. X#define NODEMAX (65533) /* up to 65533---could be 65534 for whap */
  1087. X#endif
  1088. X#ifndef NODENUM
  1089. X#define NODENUM NODEMAX
  1090. X#endif
  1091. X
  1092. X#ifndef MOD
  1093. X#define MOD (65536)
  1094. X#endif
  1095. X
  1096. XSTATICDECLARE(n,p,h,NODEMAX,MOD - 1)
  1097. X#ifndef WHAP
  1098. Xnode s[NODEMAX + 1];
  1099. Xhash geth[NODEMAX + 2]; /* XXX: only because of this is 65533 the default */
  1100. X#endif
  1101. X
  1102. X#define NUMOF(no) node2pos(n,no,NODEMAX)
  1103. X
  1104. X#define CHECKMAXBITS \
  1105. X((max == nextbits) && ((bits++), \
  1106. X  (nextbits = pos2ipos(n,2 * ipos2pos(n,nextbits,NODEMAX),NODEMAX))))
  1107. X
  1108. X#ifndef WHAP
  1109. X#define ADD(hash,oldnode,node) \
  1110. X( (void) ( ADDMAX(n,p,h,max,oldnode,hash,node), \
  1111. X  (geth[node2ipos(n,node,NODEMAX)] = hash), CHECKMAXBITS ) )
  1112. X#else
  1113. X#define ADD(hash,oldnode,node) \
  1114. X( (void) ( ADDMAX(n,p,h,max,oldnode,hash,node), CHECKMAXBITS ) )
  1115. X#endif
  1116. X
  1117. X#define SUB(ip1,ip2) (ip1 - ip2) /* XXXX: This breaks encapsulation! Ungood. */
  1118. X
  1119. Xstatic unsigned long savein = 0;
  1120. Xstatic unsigned long saveout = 0;
  1121. Xstatic int flagverbose = 1;
  1122. X
  1123. Xvoid goaheadandbeverbose()
  1124. X{
  1125. X long per;
  1126. X      
  1127. X per = percent(saveout,savein,10000L);
  1128. X if (per == 10000L) /* absolutely ridiculous */
  1129. X   if (flagverbose == 2)
  1130. X     fprintf(stderr,"In: %ld chars  Out: %ld chars  %s to: >9999%%\n",
  1131. X     savein,saveout,progged);
  1132. X   else
  1133. X     fprintf(stderr,"In: %ld chars  Out: %ld chars  %s by: <-9899%%\n",
  1134. X     savein,saveout,progged);
  1135. X else
  1136. X   if (flagverbose == 2)
  1137. X     fprintf(stderr,"In: %ld chars  Out: %ld chars  %s to: %ld%%\n",
  1138. X     savein,saveout,progged,per);
  1139. X   else
  1140. X     fprintf(stderr,"In: %ld chars  Out: %ld chars  %s by: %ld%%\n",
  1141. X     savein,saveout,progged,100 - per);
  1142. X}
  1143. X
  1144. Xint y[55];
  1145. Xint j;
  1146. Xint k;
  1147. X
  1148. X#define RANDOMBIT ( ( !j ? (j = 54) : --j ), \
  1149. X( !k ? (k = 54) : --k ), ( y[k] ^= y[j] ) )
  1150. X
  1151. Xvoid initrandom()
  1152. X{
  1153. X int i;
  1154. X
  1155. X#ifdef RANDINIT
  1156. X srand(RANDINIT);
  1157. X#else
  1158. X srand(1);
  1159. X#endif
  1160. X for (i = 0;i < 54;i++)
  1161. X   y[i] = ((rand()) + (rand() >> 13) + (rand() % 71)) % 2;
  1162. X y[54] = 1;
  1163. X j = 24;
  1164. X k = 0;
  1165. X for (i = 0;i < 100;i++)
  1166. X   (void) RANDOMBIT;
  1167. X}
  1168. X
  1169. Xvoid fatalinfo(x,ss)
  1170. Xint x;
  1171. Xchar **ss;
  1172. X{
  1173. X if (flagverbose) while (*ss)
  1174. X  {
  1175. X   fprintf(stderr,*(ss++),NODENUM);
  1176. X   putc('\n',stderr);
  1177. X  }
  1178. X (void) exit(x);
  1179. X}
  1180. X
  1181. Xmain(argc,argv)
  1182. Xint argc;
  1183. Xchar *argv[];
  1184. X{
  1185. X register node oldnode;
  1186. X register hash oldhash;
  1187. X register node curnode;
  1188. X register hash curhash;
  1189. X#ifndef WHAP
  1190. X register node matchnode;
  1191. X register hash matchhash;
  1192. X register node dosnode;
  1193. X register node safenode;
  1194. X#else
  1195. X register node lastnode;
  1196. X register hash lasthash;
  1197. X register node midnode;
  1198. X register hash midhash;
  1199. X#endif
  1200. X register int ch;
  1201. X register bitnum curbits;
  1202. X#ifdef WHAP
  1203. X register node firstmidnode;
  1204. X register node newnode;
  1205. X#endif
  1206. X register ipos max;
  1207. X register ipos nextbits;
  1208. X register bitnum bits;
  1209. X register ipos min;
  1210. X register long numin = 0;
  1211. X register long nextreset;
  1212. X register int flagrandom = 0;
  1213. X ipos curmax;
  1214. X ipos curnextbits;
  1215. X long eff;
  1216. X pos smax;
  1217. X
  1218. X#define PUTERR { \
  1219. Xif (flagverbose) fprintf(stderr,"%s: fatal: output error\n",progname); \
  1220. Xsavein += numin; saveout += bit_numout; /*XXX*/ \
  1221. Xif (flagverbose >= 2) goaheadandbeverbose(); (void) exit(2); }
  1222. X
  1223. X
  1224. X min = pos2ipos(n,NODENUM - 1,NODEMAX);
  1225. X
  1226. X  {
  1227. X   int opt;
  1228. X   bitword i;
  1229. X
  1230. X   while ((opt = getopt(argc,argv,"m:v^qQrz:Z:RACHUVW")) != EOF)
  1231. X     switch(opt)
  1232. X      {
  1233. X       case '?': fatalinfo(1,squsage);
  1234. X       case 'm': i = atol(optarg);
  1235. X         if ((i < 512) || (i > NODEMAX))
  1236. X          {
  1237. X           if (flagverbose) fprintf(stderr,
  1238. X              "%s: fatal: mem size out of range: must be between 512 and %ld\n",
  1239. X              progname,(long) NODEMAX);
  1240. X           (void) exit(1);
  1241. X          }
  1242. X         min = pos2ipos(n,i - 1,NODEMAX);
  1243. X         break;
  1244. X       case 'v': flagverbose = 2; break;
  1245. X       case '^': flagverbose = 3; break;
  1246. X       case 'q': flagverbose = 0; break;
  1247. X       case 'Q': flagverbose = 1; break;
  1248. X       case 'r': flagrandom = 1; break;
  1249. X       case 'R': flagrandom = 0; break;
  1250. X       case 'z': resetnum = atol(optarg);
  1251. X         if (resetnum < 512) resetnum = 512;
  1252. X         break;
  1253. X       case 'Z': resetfuzz = atol(optarg); break;
  1254. X       case 'A': fatalinfo(1,sqauthor);
  1255. X       case 'C': fatalinfo(1,sqcopyright);
  1256. X       case 'H': fatalinfo(1,sqhelp);
  1257. X       case 'U': fatalinfo(1,squsage);
  1258. X       case 'V': fatalinfo(1,sqversion);
  1259. X       case 'W': fatalinfo(1,sqwarranty);
  1260. X      }
  1261. X   argv += optind;
  1262. X   argc -= optind;
  1263. X  }
  1264. X
  1265. X#ifdef WHAP
  1266. X if (flagverbose)
  1267. X   fprintf(stderr,whapwarning);
  1268. X#endif
  1269. X
  1270. X if (flagrandom)
  1271. X   initrandom();
  1272. X else
  1273. X  {
  1274. X   pos i = ipos2pos(n,min,NODEMAX) + 1;
  1275. X   bitword q = 1;
  1276. X   char r = 1;
  1277. X
  1278. X   while (q <= i / 10)
  1279. X    {
  1280. X     q *= 10;
  1281. X     ++r; /* this could overflow! :-) */
  1282. X    }
  1283. X#ifndef WHAP
  1284. X   putchar(25); putchar(1); putchar(2); putchar(2); putchar(1);
  1285. X#else
  1286. X   putchar(23); putchar(8); putchar(1); putchar(16);
  1287. X#endif
  1288. X   putchar(r);
  1289. X#ifndef WHAP
  1290. X   saveout += 6;
  1291. X#else
  1292. X   saveout += 5;
  1293. X#endif
  1294. X   while (q)
  1295. X    {
  1296. X     putchar(48 + (i / q));
  1297. X     ++saveout;
  1298. X     i -= (i / q) * q;
  1299. X     q /= 10;
  1300. X    }
  1301. X  }
  1302. X
  1303. X FIRSTHASH(h,MOD - 1)
  1304. X
  1305. X
  1306. Xrestart:
  1307. X
  1308. X STATICINIT(n,p,h,max,smax,NODEMAX,MOD - 1)
  1309. X
  1310. X nextbits = pos2ipos(n,ALPHABET,NODEMAX);
  1311. X bits = 8;
  1312. X nextreset = 0;
  1313. X eff = 0;
  1314. X
  1315. X#ifndef WHAP
  1316. X geth[node2ipos(n,topnode(n,NODEMAX),NODEMAX)] = tophash(h,MOD - 1);
  1317. X#endif
  1318. X
  1319. X for (ch = 0;ch < ALPHABET;++ch)
  1320. X  {
  1321. X   curhash = tophash(h,MOD - 1);
  1322. X   curhash = hc(curhash,ch,MOD - 1);
  1323. X   ADD(curhash,topnode(n,NODEMAX),curnode);
  1324. X#ifndef WHAP
  1325. X   s[node2ipos(n,curnode,NODEMAX)] = topnode(n,NODEMAX);
  1326. X#endif
  1327. X  }
  1328. X WASTEMAX(n,p,h,max,smax,curnode); CHECKMAXBITS;
  1329. X /* leaving space for the clear code, ALPHABET */
  1330. X
  1331. X#ifndef WHAP
  1332. X safenode = ipos2node(n,max,NODEMAX);
  1333. X#endif
  1334. X
  1335. X oldnode = topnode(n,NODEMAX);
  1336. X oldhash = tophash(h,MOD - 1);
  1337. X
  1338. X#ifndef WHAP
  1339. X matchnode = topnode(n,NODEMAX);
  1340. X matchhash = tophash(h,MOD - 1);
  1341. X#else
  1342. X lastnode = topnode(n,NODEMAX);
  1343. X lasthash = tophash(h,MOD - 1);
  1344. X#endif
  1345. X
  1346. X#ifdef WHAP
  1347. X midhash = lasthash;
  1348. X firstmidnode = 0; /* still in tree */
  1349. X#endif
  1350. X
  1351. X curbits = bits;
  1352. X curmax = max;
  1353. X curnextbits = nextbits;
  1354. X
  1355. X for (;;)
  1356. X  {
  1357. X   ch = getchar();
  1358. X   if (ch == EOF)
  1359. X    {
  1360. X     if (flagrandom)
  1361. X      {
  1362. X       int b;
  1363. X
  1364. X       if (oldnode != topnode(n,NODEMAX))
  1365. X     if (bits_out((NUMOF(oldnode) + 1 < SUB(curmax,curnextbits)) &&
  1366. X                  RANDOMBIT ?
  1367. X                  (NUMOF(oldnode) + ipos2pos(n,curmax,NODEMAX) + 1) :
  1368. X              (NUMOF(oldnode))
  1369. X              ,bits) == EOF)
  1370. X       PUTERR
  1371. X       b = RANDOMBIT; b = b + b;
  1372. X       b += RANDOMBIT; b = b + b; b += RANDOMBIT; b = b + b;
  1373. X       b += RANDOMBIT; b = b + b; b += RANDOMBIT; b = b + b;
  1374. X       b += RANDOMBIT; b = b + b; b += RANDOMBIT; b = b + b;
  1375. X       b += RANDOMBIT;
  1376. X       if (bit_fillflush(b) == EOF)
  1377. X     PUTERR
  1378. X      }
  1379. X     else
  1380. X      {
  1381. X       if (oldnode != topnode(n,NODEMAX))
  1382. X         if (bits_out(NUMOF(oldnode),bits) == EOF)
  1383. X       PUTERR
  1384. X       if (bit_flushbuf() == EOF)
  1385. X     PUTERR
  1386. X      }
  1387. X     savein += numin;
  1388. X     saveout += bit_numout;
  1389. X     /* XXX: test for overflow? */
  1390. X     if (flagverbose >= 2)
  1391. X       goaheadandbeverbose();
  1392. X     (void) exit(0);
  1393. X    }
  1394. X   numin++;
  1395. X   for (;;)
  1396. X    {
  1397. X     /* We use some tricks to avoid any need for backtracking. */
  1398. X
  1399. X#ifndef WHAP
  1400. X#define MATCHADD { if (dosnode) { ADD(matchhash,matchnode,oldnode); \
  1401. Xs[node2ipos(n,dosnode,NODEMAX)] = oldnode; dosnode = oldnode; } \
  1402. Xelse ADD(matchhash,matchnode,dosnode); \
  1403. Xmatchnode = s[node2ipos(n,matchnode,NODEMAX)]; \
  1404. Xmatchhash = geth[node2ipos(n,matchnode,NODEMAX)]; \
  1405. X}
  1406. X
  1407. X/* XXXX: get rid of first if (max != min) ? */
  1408. X/* XXXX: is the inner DOWNI too slow? */
  1409. X#define MATCHDOWN if (max != min) { dosnode = 0; \
  1410. Xdo { matchhash = hc(matchhash,ch,MOD - 1); \
  1411. XDOWNI(n,p,h,matchnode,matchhash,oldnode,{break;},MATCHADD) } while(max != min); \
  1412. Xif (dosnode) s[node2ipos(n,dosnode,NODEMAX)] = oldnode; \
  1413. Xmatchnode = oldnode; }
  1414. X/* XXX: Should unroll the loop a bit. */
  1415. X
  1416. X#define SAFEMATCHDOWN { if (curnode > safenode) /*XXX: AARGH!*/ \
  1417. X{ MATCHDOWN break; } }
  1418. X#endif
  1419. X
  1420. X#ifdef WHAP
  1421. X#define MIDDOWNF lastnode = firstmidnode; \
  1422. XWASTEMAX(n,p,h,max,smax,firstmidnode); CHECKMAXBITS; firstmidnode = 0;
  1423. X
  1424. X#define MIDADDF ADD(midhash,0,midnode); firstmidnode = midnode;
  1425. X
  1426. X#define MIDADDM newnode = midnode; ADD(midhash,newnode,midnode);
  1427. X
  1428. X#define MIDDOWN if (max != min) { midhash = hc(midhash,ch,MOD - 1); \
  1429. Xif (!firstmidnode) { \
  1430. XDOWN(n,p,h,lastnode,midhash,firstmidnode,MIDDOWNF,MIDADDF) \
  1431. X} else { MIDADDM } }
  1432. X
  1433. X#define SAFEMATCHDOWN { MIDDOWN break; }
  1434. X#endif
  1435. X
  1436. X     curhash = hc(oldhash,ch,MOD - 1);
  1437. X     DOWN(n,p,h,oldnode,curhash,curnode,SAFEMATCHDOWN,{;})
  1438. X
  1439. X/* Sheer hell for your optimizer. [grin] */
  1440. X
  1441. X     if (flagrandom)
  1442. X      {
  1443. X       if (bits_out((NUMOF(oldnode) + 1 < SUB(curmax,curnextbits)) &&
  1444. X            RANDOMBIT ?
  1445. X                    (NUMOF(oldnode) + ipos2pos(n,curmax,NODEMAX) + 1):
  1446. X            (NUMOF(oldnode))
  1447. X                ,curbits) == EOF)
  1448. X     PUTERR
  1449. X       curmax = max;
  1450. X       curnextbits = nextbits;
  1451. X      }
  1452. X     else if (bits_out(NUMOF(oldnode),curbits) == EOF)
  1453. X       PUTERR
  1454. X
  1455. X     curbits = bits;
  1456. X
  1457. X#ifdef WHAP
  1458. X     if (firstmidnode)
  1459. X       setparent(p,firstmidnode,lastnode);
  1460. X     /* hence adding entire tree from neutral down onto lastnode */
  1461. X#endif
  1462. X
  1463. X     if (max == min)
  1464. X      {
  1465. X       if (numin >= nextreset)
  1466. X    {
  1467. X     nextreset = numin + resetnum;
  1468. X     /* XXX: this isn't accurate, we don't know how many bits... */
  1469. X     if ((eff * ((bit_numout + 2 * bit_bufsize) / 16)) < numin + resetfuzz)
  1470. X       eff = numin / ((bit_numout + 2 * bit_bufsize) / 16);
  1471. X     else
  1472. X      {
  1473. X       savein += numin;
  1474. X       saveout += bit_numout;
  1475. X       /* XXX: test for overflow? */
  1476. X       numin = 0;
  1477. X       bit_numout = 0;
  1478. X
  1479. X       if (flagrandom)
  1480. X        { /*XXX*/
  1481. X         if (bits_out((ALPHABET + 1 < SUB(max,nextbits)) && RANDOMBIT ?
  1482. X              (ALPHABET + ipos2pos(n,max,NODEMAX) + 1) :
  1483. X              ALPHABET,bits) == EOF)
  1484. X           PUTERR
  1485. X        }
  1486. X       else
  1487. X         if (bits_out(ALPHABET,bits) == EOF)
  1488. X           PUTERR
  1489. X
  1490. X           CLEARHASH(h,MOD - 1)
  1491. X
  1492. X       (void) ungetc(ch,stdin);
  1493. X       --savein;
  1494. X       /* XXX: Shouldn't have this goto at all. */
  1495. X       goto restart;
  1496. X      }
  1497. X    }
  1498. X      }
  1499. X     else
  1500. X      {
  1501. X#ifndef WHAP
  1502. X       safenode = ipos2node(n,max,NODEMAX);
  1503. X       /* if max is min, s's past the old safenode might be out of dict */
  1504. X       /* so changing safenode here wouldn't be safe */
  1505. X#else
  1506. X       lastnode = oldnode;
  1507. X       lasthash = oldhash;
  1508. X
  1509. X       midhash = lasthash;
  1510. X
  1511. X       firstmidnode = 0;
  1512. X#endif
  1513. X      }
  1514. X     oldnode = topnode(n,NODEMAX);
  1515. X     oldhash = tophash(h,MOD - 1);
  1516. X    }
  1517. X   oldnode = curnode;
  1518. X   oldhash = curhash;
  1519. X  }
  1520. X}
  1521. END_OF_FILE
  1522.   if test 11121 -ne `wc -c <'yw.c'`; then
  1523.     echo shar: \"'yw.c'\" unpacked with wrong size!
  1524.   fi
  1525.   # end of 'yw.c'
  1526. fi
  1527. echo shar: End of archive 2 \(of 4\).
  1528. cp /dev/null ark2isdone
  1529. MISSING=""
  1530. for I in 1 2 3 4 ; do
  1531.     if test ! -f ark${I}isdone ; then
  1532.     MISSING="${MISSING} ${I}"
  1533.     fi
  1534. done
  1535. if test "${MISSING}" = "" ; then
  1536.     echo You have unpacked all 4 archives.
  1537.     rm -f ark[1-9]isdone
  1538. else
  1539.     echo You still must unpack the following archives:
  1540.     echo "        " ${MISSING}
  1541. fi
  1542. exit 0
  1543. exit 0 # Just in case...
  1544.